There is also a non empty intersection between a sum type and an enum type, 
obviously you can swith on both of them, but more generally an abstract enum 
(an enum that uses subclassing) is a specialized version of a sum type. And if 
we generalize sum types to allow constants, we are bridging the gap further 
between sum types and enums. 

By example, a functional list can be declared like this 
sum List<T> { 
record Node<T>(T value, Node<T> next), 
EMPTY<T> 
} 
... 
var list = new Node<>(3, new Node<>(2, EMPTY)); 

Rémi 

> De: "Brian Goetz" <brian.go...@oracle.com>
> À: "Kevin Bourrillion" <kev...@google.com>
> Cc: "amber-spec-experts" <amber-spec-experts@openjdk.java.net>
> Envoyé: Mercredi 12 Décembre 2018 18:01:06
> Objet: Re: enhanced enums - back from the dead?

> Yes, you could spin this feature as “its sort of for experts”, note the
> incremental complexity, and then raise the “why bother” flag. That’s a valid
> question.

> But, I prefer to look at this feature in a different way. This is not, IMO, 
> just
> “let’s make enums do more.” This is about _simplifying_ the language model by
> removing gratuitous interactions between features. Enums are a constrained 
> form
> of classes, one whose instances are singletons managed by the runtime. Because
> the user gives up instance control, we’re able to reward the user with things
> like equals/hashCode/toString, serialization, etc. That’s a good trade. Enums
> can still use most of the things that classes have — fields, methods,
> constructors, interfaces. But there’s no reason they can’t be generic, and
> allowing that would reduce the inessential differences between enums and
> classes.

> The other asymmetry is newer; since we inferred sharp types for anonymous
> classes when we did LVTI, inferring a weaker type for enum constants is now an
> asymmetry (one we were aware of when we did LVTI, but the plan all along was 
> to
> align these.)

> I know that I personally have run into both of these limitations at least once
> in every large project I’ve ever done. You start out with an enum, for good
> reasons, then you hit the limits, and then have to refactor to classes,
> manually inflating the instance control boilerplate. Its frustrating, in part,
> because its unnecessary. There’s nothing inconsistent about generic enums; 
> it’s
> just an accidental “pick one” constraint that you discover when you find
> yourself wanting both.

> So, I prefer to look at this feature as “regularization” or “removing 
> gratuitous
> interactions”, rather than “making enums more complicated.” (It’s in the same
> category as some other things we’re considering, such as allowing local
> methods, or refining the awful rules about static members in nested classes.)
> All of these are accidental sharp edges, that create unnecessary cognitive 
> load
> for users to keep track of which features can be used in conjunction with 
> which
> others.

>> On Dec 12, 2018, at 11:40 AM, Kevin Bourrillion < [ mailto:kev...@google.com 
>> |
>> kev...@google.com ] > wrote:

>> On Tue, Dec 11, 2018 at 12:25 PM Brian Goetz < [ 
>> mailto:brian.go...@oracle.com |
>> brian.go...@oracle.com ] > wrote:

>>> This uber-conservative approach seems a pretty reasonable approach to
>>> me; after all, enums are a language feature, and Enum<T> is a
>>> constrained class (can't implement it directly), so it is not
>>> unreasonable to define its typing wrt its supertypes specially.

>>> So, let's get back to Maurizio's original question, which is: At one
>>> point, we thought this feature was pretty cool, and invested some work
>>> in it. Then we ran into a roadblock, and wrote it off. Now, we've got
>>> a reasonable way to clear the roadblock. Which brings us back to:

>>> - Do we still like the features described in JEP 301?

>> What proportion of enum use cases benefit from this? Offhand, I would have to
>> guess that it is less than 0.1% (and if it turned out to be far less it
>> wouldn't shock me). Does anyone believe it's likely enough to be >0.1% that
>> it's worth my effort to try to research that question in our codebase (which
>> would take a bit of work)?

>> If not, and we can stipulate that the need is rare, this means it will be a 
>> very
>> special tool for very special people; a dark corner in the language feature 
>> set
>> that most Java developers will never have need to know -- until they suddenly
>> encounter code that uses it, upon which they need to invest an amount of 
>> effort
>> understanding what is going on, even though they may have 14 years of 
>> believing
>> they understood enums under their belts already. And if the need is this 
>> rare,
>> this effort they put in might never be fully paid back.

>> On the flip side, for a developer who does have this use case, and could 
>> benefit
>> from the feature, what are the chances that developer will even know about 
>> it?
>> It may be so special-purpose that we have no real reason to assume they'll 
>> know
>> what to do.

>> On top of this, it seems the feature apparently has a blast radius onto 
>> aspects
>> of enum design that have previously been stable.

>> Can a 0.1% use case ever really be worth this?

>> --
>> Kevin Bourrillion | Java Librarian | Google, Inc. | [ 
>> mailto:kev...@google.com |
>> kev...@google.com ]

Reply via email to