6407460: provide Collections helper methods for new interfaces in JDK 1.6

Brian Goetz brian.goetz at oracle.com
Thu Jan 27 17:27:20 UTC 2011


Overall these look like good additions.  I haven't reviewed the code in 
detail but a quick sanity check suggests that this is a good direction. 
  There's definitely some more work needed on the testing (for example, 
testing that the contents of x and unmodifiable(x) are identical, 
testing that the unmodifiable collection reflects changes in the 
underlying mutable collection, testing the sortedSet/navigableSet 
methods for empty{Sorted,Navigable}Set, etc).

As to the concurrent collection interfaces, I don't think they're 
strictly needed, but they do make sense.  The methods added by 
ConcurrentMap over Map are all mutative, so immutableMap(concurrentMap) 
should produce the desired behavior but not necessarily the desired 
contract.

On 1/16/2011 6:42 PM, David Schlosnagle wrote:
> Hello core-lib-devs,
>
> The recent discussions around Objects.nonNull prompted me to create a
> patch (attached) to add the methods below to java.util.Collections for
> consistency with existing methods. According to the Annotated Outline
> of Collections Framework [1] [2], the unmodifiable<Interface>  methods
> for some of the newer Collection types (Queue, Deque, NavigableSet,
> NavigableMap) seem to be missing, and the empty<Interface>  methods for
> many new and old interfaces (SortedSet, NavigableSet, Queue, Deque,
> SortedMap, NavigableMap) that would also be nice to have.
>
> In some of my projects, I could really benefit from having these
> additional Collections.empty* and Collections.unmodifiable* helper
> methods to simplify my code. In many cases these are places where
> internally a null collection is used to allow for lazy initialization,
> but the externally exposed APIs would always return an empty or
> unmodifiable collection via a simple toUnmodifiable utility method
> (where to include those in the JDK is probably a whole separate
> argument). Previously the interfaces exposed in my APIs were often
> List, Map, or Set, but more recently I've also been using SortedMap
> and SortedSet where applicable, so I've felt a little pain for not
> having all of the expected methods in Collections. There are of course
> libraries such as Guava that also provide the majority of these (and
> much more), but I think it would be nice to have this in the JDK.
>
> There seems to have been some discussion and bug IDs related to some
> of these methods over the past few years [3] [4] [5] [6], but I'm
> curious if this is something that would be considered for adding to
> the Java API, and if so would it be for JDK 1.7 or 1.8 seeing as how
> Mark indicated 1.7 was feature complete? I look forward to everyone's
> feedback.
>
> +    public static<E>  SortedSet<E>  emptySortedSet()
> +    public static<E>  NavigableSet<E>  emptyNavigableSet()
> +    public static<E>  Queue<E>  emptyQueue()
> +    public static<E>  Deque<E>  emptyDeque()
> +    public static<K, V>  SortedMap<K, V>  emptySortedMap()
> +    public static<K, V>  NavigableMap<K, V>  emptyNavigableMap()
> +    public static<E>  NavigableSet<E>
> unmodifiableNavigableSet(NavigableSet<E>  s)
> +    public static<E>  Iterator<E>  unmodifiableIterator(Iterator<?
> extends E>  it)
> +    public static<E>  ListIterator<E>
> unmodifiableListIterator(ListIterator<? extends E>  it)
> +    public static<E>  Queue<E>  unmodifiableQueue(Queue<? extends E>  q)
> +    public static<E>  Deque<E>  unmodifiableDeque(Deque<E>  q)
> +    public static<K, V>  NavigableMap<K, V>
> unmodifiableNavigableMap(NavigableMap<K, ? extends V>  m)
>
> Here's a little summary of what versions of the JDK contain the
> various empty and unmodifiable methods, and which are covered by this
> patch:
>
> Interface               empty*  unmodifiable*
> ----------------------  ------  -------------
> Collection              n/a     1.2+
> Set                     1.5+    1.2+
> List                    1.5+    1.2+
> Queue                   patch   patch
> Deque                   patch   patch
> Map                     1.5+    1.2+
> SortedSet               patch   1.2+
> SortedMap               patch   1.2+
> NavigableSet            patch   patch
> NavigableMap            patch   patch
> BlockingQueue           ?       ?
> TransferQueue           ?       ?
> BlockingDeque           ?       ?
> ConcurrentMap           ?       ?
> ConcurrentNavigableMap  ?       ?
> Iterator                1.7+    patch
> ListIterator            1.7+    patch
>
> I've updated a few of the jtreg tests as initial sanity checks, but if
> this patch were to be considered I'd want to expand those a bit more.
> I haven't yet addressed the missing synchronized<Interface>  (Queue,
> Deque, NavigableSet, NavigableMap), checked<Interface>  (Queue, Deque,
> NavigableSet, NavigableMap), singleton<Interface>  (SortedSet,
> NavigableSet, Queue, Deque, SortedMap, NavigableMap) methods. Also, I
> haven't created analogous methods for any of the java.util.concurrent
> interfaces as I'm not sure that these methods necessarily make sense
> for those types.
>
> - Dave
>
> P.S. I submitted a signed OCA to sun_ca at sun.com earlier today, but I'm
> assuming it will take a while to be added to
> https://sca.dev.java.net/CA_signatories.htm since it is a holiday
> weekend here in the USA.
>
> References:
> [1]: http://download.oracle.com/javase/6/docs/technotes/guides/collections/reference.html
> [2]: http://download.java.net/jdk7/docs/technotes/guides/collections/reference.html
> [3]: 4834905: Support read-only Iterator, i.e., without remove():
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4834905
> [4]: 5030930: JDK1.5 The method Collections.unmodifiableQueue(Queue<?
> extends T>) is missing:
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5030930
> [5]: 6407460: (coll) provide Collections helper methods for new
> interfaces in JDK 1.6:
> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6407460
> [6]: How about Collections.emptySorted[Set|Map] ?:
> http://markmail.org/message/6u23eysno2mt6ia4



More information about the core-libs-dev mailing list