Home > DeveloperSection > Forums > java support instance variables of java enum constants
Ankit Singh

Total Post:341

Points:2389
Posted on    October-16-2014 12:23 AM

 Java Java  OOPS 
Ratings:


 1 Reply(s)
 721  View(s)
Rate this:
I know that in Java an enum constant is implicitly static final variable. But the enum class can have an instance variable say size. So each enum constant will have a copy of 'size'. What is the equivalent Java code for this? I mean it "seems" the static enum constant is using a non-static instance variable which is not possible normally?

enum Members{

        A(1),B(2),C(3);  // I have 3 enum constants here

 

        private int size;

        Members (int size) {

            //System.out.println("Initializing var with size = "+size);

        }

    }

Equivalent code I know so far:

public final class Member extends Enums<Members> {

        public static final Members A;

        // ...

        // What happened to size? How do A,B,C get a copy of size?

    }

Edit : To restate my question- I am interested in behind the scene implementation by compiler. I already know how to use enums. I am looking for what the compiler does? (so for example, if I simply write A, the compiler translates it to "public static final Member A". I want to know how compiler gives a copy of size to each A,B,C.



Chintoo Semi

Total Post:135

Points:947
Posted on    October-16-2014 12:25 AM

I mean it "seems" the static enum constant is using a non-static instance variable which is not possible normally?

It is absolutely possible: each static variable in the enum is an object in its own right, complete with its instance variables. The instance is static in the enum, but it does not make the context of the instance itself a static context.

public final class Member extends java.lang.Enums<Members> {

    public static final Members A = new Member(1) {

        public String toString() { return "A:"+size; }

    };

    public static final Members B = new Member(2) {

        public String toString() { return "B:"+size; }

    };

    public static final Members C = new Member(3) {

        public String toString() { return "C:"+size; }

    };

    private final int size;

    protected Member(int size) { this.size = size; }

}


Don't want to miss updates? Please click the below button!

Follow MindStick