On Aug 9 2013, at 06:04 , Paul Sandoz wrote:
> Hi Peter,
>
> On Aug 8, 2013, at 12:44 PM, Peter Levart <[email protected]> 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.