JAVA SUPPORT INSTANCE VARIABLES OF JAVA ENUM CONSTANTS

Ankit Singh

Total Post:341

Points:2389
Posted by  Ankit Singh
Java  OOPS 
 1059  View(s)
Ratings:
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.

  1. Chintoo Semi

    Post:135

    Points:947
    Re: java support instance variables of java enum constants

    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; }

    }

Answer

NEWSLETTER

Enter your email address here always to be updated. We promise not to spam!