java如何支持java enum常量的实例变量?

时间:2014-10-12 14:41:26

标签: java enums

我知道在Java中enum常量是隐式static final变量。但是enum类可以有一个实例变量,例如size。因此,每个enum常量都将具有“大小”的副本。 这个等效的Java代码是什么?我的意思是“似乎”静态enum常量使用非静态实例变量,这通常是不可能的?

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

到目前为止我所知道的等效代码:

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

编辑:重述我的问题 - 我对编译器的场景实现感兴趣。我已经知道如何使用枚举。我在寻找编译器的功能? (例如,如果我只是编写A,编译器会将其转换为“public static final Member A”。我想知道编译器如何为每个A,B,C提供大小的副本。

2 个答案:

答案 0 :(得分:3)

  

我的意思是“似乎”静态枚举常量是使用非静态实例变量,这通常是不可能的?

绝对可能:static中的每个enum变量本身就是一个对象,并且包含其实例变量。 static中的实例为enum,但它不会使实例本身的上下文成为静态上下文。

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

答案 1 :(得分:2)

  

我的意思是&#34;似乎&#34;静态枚举常量是使用非正常的实例变量吗?

     

我的意思是&#34;通常&#34;在非枚举类中,静态变量无法访问非静态变量

它仍然是正确的:静态变量无法访问非静态变量。 在您的示例代码中,您不必执行此操作: 没有静态变量访问非静态变量。

构造函数Members(int size)不在静态上下文中(构造函数永远不会)。 A,B和C都是枚举类型Members的所有实例, 当这些实例创建时, 使用size参数调用构造函数。 构造完成后,这些对象将被视为静态常量值。

也许另一个例子可以提供帮助:

class Person {
    private final String name;
    Person(String name) {
        this.name = name;
    }
}
class EmployeeDatabase {
    private static final Person CEO = new Person("Jack");
}

此处EmployeeDatabase.CEO是具有非静态字段name的静态常量对象。 这就像Members.A一样,是一个带有非静态字段size的静态常量对象。

  

我想知道编译器如何为每个A,B,C提供大小的副本。

与将构造函数参数传递给任何对象的方式完全相同。

您可以在docs

中阅读有关枚举的所有内容