On second thought, maybe it was too early and some consideration should be given to whether and how Java 9+ modules (with which I do not profess expertise) could address this issue without the baby/bathwater situation of migrating the package of the whole library.
Matt On Fri, Sep 8, 2023, 8:46 AM Matt Benson <mben...@apache.org> wrote: > IMO the version bump is warranted/I'd select option 2 (although if it's > not too early for me I don't see these options as being mutually exclusive). > > Matt > > On Fri, Sep 8, 2023, 7:46 AM Alex Herbert <alex.d.herb...@gmail.com> > wrote: > >> JDK 21 has added these methods to java.util.List: >> >> default public void addFirst(E o) >> default public void addLast(E o) >> >> These are source incompatible with Commons Collections AbstractLinkedList: >> >> public boolean addFirst(E o) >> public boolean addLast(E o) >> >> This affects AbstractLinkedList and any list that extends it >> (CursorableLinkedList and NodeCachingLinkedList). >> >> This issue was identified by Julian Reschke (see [1, 2]) due to use of >> code that extends AbstractLinkedList in Apache Jackrabbit. >> >> The source incompatibility means that collections, or any project that >> extends these List classes, cannot be compiled with Java 21. Class >> files compiled with Java < 21 are runtime compatible with Java 21. >> >> A performance test (on one machine) shows that NodeCachingLinkedList >> may no longer offer any performance gain over the base implementation. >> The NodeCachingLinkedList differs in that it reuses nodes rather than >> allowing garbage collection. Subject to further performance testing, >> this implementation can be deprecated. >> >> CursorableLinkedList provides functionality not in the JDK LinkedList. >> This is to allow concurrent changes to the list with list methods and >> iterator methods, or multiple iterators, for the lifetime of all >> iterators. In contrast JDK LinkedList only allows modification to the >> list via the (single) iterator during the lifetime of the iterator. >> >> The problem then becomes how to support AbstractLinkedList and >> CursorableLinkedList. Currently collections4 will not be source >> compatible with JDK 21. Any downstream project that extends these >> classes will not be source compatible with JDK 21. >> >> Possible solutions: >> >> 1. Duplicate AbstractLinkedList (and possibly CursorableLinkedList) in >> collections4 and update the methods signatures to be compatible in the >> duplicate. >> >> This solution allows collections4 to be compiled with JDK 8, 11, 17. >> It cannot be compiled with 21. Any downstream project can extend the >> duplicate class and be compiled under Java 21 (assuming all references >> to incompatible classes are removed). >> >> 2. Bump collections major version to 5 and fix the incompatibility. >> >> Note that collections 4.4 was released in Jul 2019. This option could >> perform one last release of collections 4 to release all fixes and >> changes, then proceed to collections 5 for the development branch. >> >> I am unfamiliar with the entire collections codebase and the clean-up >> work required for a major revision bump. Note the new bloomfilter >> package is as yet unreleased. So choosing this option provides the >> ability to release a 5-beta to receive community feedback on the >> bloomfilter API before an official release. >> >> Any other options are welcomed for discussion. >> >> Alex >> >> [1] https://lists.apache.org/thread/lnrzdv348q8g64dlno6xq84wb49vbc2c >> [2] https://issues.apache.org/jira/browse/COLLECTIONS-842 >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >> For additional commands, e-mail: dev-h...@commons.apache.org >> >>