constant references in enums
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Fri Jan 22 00:51:07 UTC 2016
My bad - the section you quote refers to a different scenario:
enum Foo {
BAR;
static int e = 0; //non constant
final static int ce = 42; //constant
//8.9.2: It is a compile-time error to reference a static field of
an enum type from...
// instance variable initializer expression
int field1 = e;
int field2 = ce;
// instance initializers
{
int i1 = e;
int i2 = ce;
}
//constructors
Foo() {
int i1 = e;
int i2 = ce;
}
}
So, in your case the access is occurring from another *static* variable
initializer, so 8.9.2 does not apply. Which I think means that the same
rules for ordinary classes apply - meaning that forward reference for
statics is only allowed with fully qualified name. So it is consistent.
And it is not a bug. Let's wait from some spec guru to chime in.
Maurizio
On 22/01/16 00:41, Maurizio Cimadamore wrote:
> If it helps - this is rejected too:
>
> class FooE {
> static FooE fe = new FooE(FOOC); // ?? error: illegal forward
> reference
> FooE(int k) {}
> public static final int FOOC = 42; // a constant variable
> }
>
> But - this isn't:
>
> class FooE {
> static FooE fe = new FooE(*FooE.*FOOC); // ?? error: illegal
> forward reference
> FooE(int k) {}
> public static final int FOOC = 42; // a constant variable
> // look, JLS 8.9.2 says "...unless the field is a constant
> variable"
> }
>
> And I know this is not a bug - i.e. the spec says that fully qualified
> names are allowed to forward references (see 8.3.3).
>
> So, I'm assuming that, since javac desugars away enums at parsing time
> (by translating them into classes similar to the one above), it ends
> up generating illegal code in your specific case. Or maybe the spec
> should be rectified to do something consistent in both cases.
>
> Btw - if you add 'FooE.' your examples compiles too :-)
>
> Maurizio
>
> On 22/01/16 00:16, John Rose wrote:
>> enum FooE {
>> FOOV(FOOC); // ?? error: illegal forward reference
>> FooE(int k) {}
>> public static final int FOOC = 42; // a constant variable
>> // look, JLS 8.9.2 says "...unless the field is a constant variable"
>> }
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20160122/1a7a57cc/attachment.html>
More information about the compiler-dev
mailing list