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


Reply via email to