tags:

views:

798

answers:

3

I can't seem to access instance members of the surrounding class from inside an enum, as I could from inside an inner class. Does that mean enums are static? Is there any access to the scope of the surrounding class's instance, or do I have to pass the instance into the enum's method where I need it?

public class Universe {
    public final int theAnswer;

    public enum Planet {
        // ...
        EARTH(...);
        // ...

        // ... constructor etc.

        public int deepThought() {
            // -> "No enclosing instance of type 'Universe' is accessible in this scope"
            return Universe.this.theAnswer;
        }
    }

    public Universe(int locallyUniversalAnswer) {
        this.theAnswer = locallyUniversalAnswer;
    }
}
+8  A: 

Yes, nested enums are implicitly static.

From the language specification section 8.9:

Nested enum types are implicitly static. It is permissable to explicitly declare a nested enum type to be static.

Jon Skeet
+4  A: 

It wouldn't make sense to make an instance-level (non-static) inner enum class - if the enum instances were themselves tied to the outer class they'd break the enum guarantee -

e.g. if you had

public class Foo {
   private enum Bar {
        A, B, C;
   } 
}

For the enum values to properly act as constants, (psuedocode, ignoring access restrictions)

Bar b1 = new Foo().A
Bar b2 = new Foo().A

b1 and b2 would have to be the same objects.

Steve B.
A: 

Are you doing something like:

 enum Thing {
     ENUM() { x = 1 };
     private int x;
 }

It's weird look up rules relating to inner classes answered in another question. Just shove this. or super. in.

 enum Thing {
     ENUM() { this.x = 1 };
     private int x;
 }

(Disclaimer: Not so much as bothered to compile this.)

Tom Hawtin - tackline