RFR(m): updated: JEP 269 initial API and skeleton implementation (JDK-8139232)

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Tue Dec 8 14:58:27 UTC 2015



On 08/12/15 00:19, Stuart Marks wrote:
> Hi Maurizio,
>
> Well, maybe we should add five more overloads to EnumSet.of()? (Only 
> slightly joking here.)
>
> Setting aside the number of overloads, it would add N more overloads 
> to Set.of(). I guess the erasure of <Z extends Enum<Z>> would be Enum, 
> so there wouldn't be any overload ambiguity....
right - no ambiguity
>
> To me the question here is whether this adds sufficient value. The 
> advantage is that one could write
>
>     Set.of(MyEnum.ONE, MyEnum.TWO, MyEnum.THREE)
>
> instead of
>
>     EnumSet.of(MyEnum.ONE, MyEnum.TWO, MyEnum.THREE)
>
> and get an optimized EnumSet instead of a Set that contains object 
> references. Is it worth it?
I'm not too worried about the fact that typing 'EnumSet' is more verbose 
than just 'Set', obviously; but it would seem reasonable to try (within 
reasonable bounds) to provide uniform way to create collections and a 
smooth user experience.

I think with the current status quo, we have that:

Set.of(A, B, C) != EnumSet.of(A, B, C)

and that's surprising, IMHO. At the same time I notice that, even with 
the overload I suggest, they would still be different beasts, as one 
would be mutable, while the other would not.

That said, I think we should aim for an API where such bad surprises are 
avoided (why is my enumset so slow? Ah - it's not an enumset because I 
used the wrong XYZ.of method); unfortunately I don't have a good 
suggestion on how to get there :-( (which might mean that what you did 
is correct :-) )

Maurizio
>
> Presumably this would result in an instance of an immutable EnumSet. 
> Does this case come up that often?
>
> s'marks
>
>
> On 12/4/15 2:22 PM, Maurizio Cimadamore wrote:
>> Hi Stuart
>> small question: I find it a bit odd that EnumSet has max 5 
>> parameters, while Set
>> has more than that.
>>
>> Also, would it be possible, maybe to add overloads to Set that 
>> specifically
>> works on Enum constants?
>>
>> <Z extends Enum<Z>> of(Z z1, Z z2) { ... }
>>
>> This would give you a way to call Set.of and get different answers 
>> based on the
>> static type of the arguments passed in - and we could deprecate the 
>> of method in
>> EnumSet?
>>
>> Too subtle/magic?
>>
>> Maurizio
>>
>> On 02/12/15 02:35, Stuart Marks wrote:
>>> Hi all,
>>>
>>> Thanks for the previous round of review comments. Here's an updated 
>>> API and
>>> implementation for review.
>>>
>>> I've run specdiff with the --hu ("hide unchanged") option, so only 
>>> the bits of
>>> the specification that have changed are shown. As before, though, 
>>> please
>>> ignore the spurious change to EnumSet caused by a javadoc bug.
>>>
>>> API changes:
>>>  - add clarifying notes on immutability
>>>  - remove wording that implied creation of new objects
>>>  - add "value-based" disclaimers
>>>  - add ordering specification for List and non-ordering disclaimers
>>>    for Set and Map
>>>  - clarify that Map.ofEntries() doesn't store the Map.Entry objects, 
>>> instead
>>>    it extracts keys and values
>>>  - Map.Entry instances returned from Map.entry() are *not* serializable
>>>
>>> Other:
>>>  - markup cleanups
>>>  - small implementation cleanups
>>>
>>> JEP:
>>>
>>>     http://openjdk.java.net/jeps/269
>>>
>>> API spec (basically List, Map, and Set):
>>>
>>> http://cr.openjdk.java.net/~smarks/reviews/jep269/api.20151201/
>>>
>>> Specdiff:
>>>
>>>
>>> http://cr.openjdk.java.net/~smarks/reviews/jep269/specdiff.20151201/overview-summary.html 
>>>
>>>
>>>
>>> Webrev:
>>>
>>> http://cr.openjdk.java.net/~smarks/reviews/jep269/webrev.20151201/
>>>
>>> Thanks,
>>>
>>> s'marks
>>




More information about the core-libs-dev mailing list