On Aug 9 2013, at 06:04 , Paul Sandoz wrote:

> Hi Peter,
> 
> On Aug 8, 2013, at 12:44 PM, Peter Levart <peter.lev...@gmail.com> wrote:
> 
>> Hi Paul,
>> 
>> Shouldn't Spliterators.EmptySpliterator also be IMMUTABLE, DISTINCT and 
>> ORDERED? Like Collections.singletonSpliterator...
>> 
> 
> Perhaps, for consistency. IIRC at the time it was felt a little odd to 
> declare such characteristics when no elements are present.

Not commenting on the specific decisions but to express general policy:

For the empty/singleton cases it seems like the flags should match as close as 
possible those which would be found on a "real" collection used in the same 
context. The "specialness" of singleton/empty should be mostly for source 
efficiency and not alter the computation. For collections in general a common 
source of frustration comes from problems arising when there is a difference 
between the behaviour of the general and the "optimization". Consider:

List<String> bar = new ArrayList<>();
bar.add("Hello World");
List<String> foobar = Collections.unmodifiableList(bar);

List<String> fubar = Collections.singeltonList("Hello World");

Any cases where the behaviour of foobar and fubar differ are going to be a 
source of frustration for users. We end up having to work hard to ensure that 
such cases don't crop up. (Which is in part why exercises like adding 
Collections.unmodifiableNavigableMap/Set are so painful).

>> Although a mutable Collection implementation or immutable with size()>1 can 
>> never be Set and List at the same time, A singleton immutable Collection I 
>> think could be. Likewise for empty immutable Collection... So why couldn't a 
>> spliterator obtained from singleton List be DISTINCT? Likewise why couldn't 
>> a spliterator obtained from singleton Set be ORDERED?...
> 
> That could be an option, but i was hesitant about explicitly stating such 
> optional constraints on Set/List.
> 
> For the current Collection implementations i would prefer not to enforce the 
> reporting of characteristics for a size of 0 or 1.
> 
> 
>> These are runtime characteristics, not characteristics of a particular 
>> collection type.
>> 
> 
> For N > 1 I would argue characteristics of top-level spliterators do map to a 
> particular collection type. Nearly all of the characteristics for at most one 
> element are irrelevant for optimizing computation 
> (SIZED/SUBSIZED/IMMUTABLE/NONULL are probably the most useful of the not very 
> useful). It's almost as if nothing == everything in this case i.e. reporting 
> no/few characteristics is the same as reporting all/most characteristics :-)
> 
> There is now Collections.emptyNavigableMap/emptySortedMap implying SORTED 
> should also be reported for the empty spliterator, unless we optionally 
> constrain SortedSet. 
> 
> There are currently no type safe ways to obtain a singleton 
> NavigableMap/SortedSet, but perhaps there could be in the future? (there was 
> probably a good reason for not adding them with the empty versions but i 
> dunno what that reason was).

They weren't added mostly to keep the scope of adding the 
checked/unmodifiable/synchronized issue from being too involved. They could 
still be added.

> Reporting SORTED for all singletons is problematic because the singleton 
> element may not be Comparable.

There's also the question of what to do when someone calls sort on it. There's 
an open question on whether Collections.sort should pre-check for size <= 1 and 
do nothing rather than throw UOE for Collections.singletonList(). It turns out 
most people find the UOE merely annoying and not useful. 

> 
> So i thought rather than attempting to be explicit about 0 or 1 element and 
> the type holding that element it was just easier all round to do some 
> hand-waving on Collections or Collection i.e. all bets are off as to what 
> characteristics are reported (beyond that of 
> SIZED/SUBSIZED/IMMUTABLE/NONNULL?) and it does not matter cause you will 
> anyway not be able to to anything useful with them.
> 
> --
> 
> Perhaps i can separate out this webrev, i presume there is little issue with 
> the other doc updates, if so i can commit those for this bug and spin up 
> another for this aspect.
> 
> Paul.

Reply via email to