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: [email protected] For additional commands, e-mail: [email protected]
