我知道在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提供大小的副本。
答案 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。
中阅读有关枚举的所有内容