hg: valhalla/valhalla/langtools: Values types must be "all final".

Remi Forax forax at univ-mlv.fr
Thu Jul 31 21:40:33 UTC 2014

On 07/31/2014 06:19 AM, Richard Steiger wrote:
> I'm new to this list, so may well have missed previous discussions 
> about the rationale for the "Value types must be all final" 
> pronouncement.
> While I'm not at all sure that value-type-finality is relevant to the 
> following, I'd like to go on record stating that one of the more 
> irritating aspects of the current enum semantics is the inability to 
> extend an existing enum type with additional values.   I appreciate 
> that there might be numerous subtleties that would need to be 
> addressed in making enums "not quite final", i.e. extensible in a 
> limited way (no overrides, etc.), the boon to application developers 
> and others seems to me to justify at least thinking-through the issues.

An enum enumerate all possible values thus you can not add a 
supplementary value by inheritance,
unlike an interface which let you provide the implementation you want an 
enum is a not an open type but a closed type.

 From the design point of view, your problem is not to allow inheritance 
on enum but why you (or any of our fellow dev) have chosen to use an 
enum to represent something you want to extend i.e. an open type.

In term of implementation having open enums is really hard, imagine that 
you have an enum Foo and two enums Bar and Baz
that inherits from Foo, how the compiler is suppose to provide the 
ordinal value in that case (don't forget that Bar and Baz can be 
compiled separately) ?
Trying to implement values() on an open enum is fun too.


> On 7/30/2014 8:31 PM, Paul Benedict wrote:
>> I've been thinking about this. When it comes to how enums were 
>> speced, they
>> didn't need "final" or "class" specifiers (yes, an enum literal can be a
>> subclass but ignore that for now). So I am not sure all these explicit
>> qualifiers are helpful for writing value classes too. Granted, this 
>> is the
>> straw man implementation, but I would like to hear anyone's thoughts on
>> just making it "public value ClassName".
>> On Jul 30, 2014 5:08 PM, <paul.govereau at oracle.com> wrote:
>>> Changeset: ecff516ac894
>>> Author:    pgovereau
>>> Date:      2014-07-30 17:05 -0400
>>> URL:
>>> http://hg.openjdk.java.net/valhalla/valhalla/langtools/rev/ecff516ac894
>>> Values types must be "all final".
>>> ! src/share/classes/com/sun/tools/javac/comp/TransValues.java
>>> ! src/share/classes/com/sun/tools/javac/resources/compiler.properties
>>> + test/tools/javac/diags/examples/ValueFinal.java
>>> + test/tools/javac/valhalla/values/CheckFInal.out
>>> + test/tools/javac/valhalla/values/CheckFinal.java
>>> + test/tools/javac/valhalla/values/CheckFinal.out

More information about the valhalla-dev mailing list