我将尝试在上述评论中添加更多内容.
枚举值有些特殊.从Java枚举的Wikipedia条目开始:
An enum type in Java is actually a special compiler-generated class rather than an arithmetic type, and enum values behave as global pre-generated instances of that class. Enum types can have instance methods and a constructor (the arguments of which can be specified separately for each enum value).
因此,虽然它们仅在编译时生成一次,但它们是给定枚举类型的特殊实例.因此,它可以访问该类的其他成员.请注意,这也意味着您无法自己实例化枚举类型(即使用new).
From one instance of enum class you can access another instance of same enum class? Which I haven’t seen in normal Java class.
这在普通类中也是可能的,虽然不赞成,因为它没有提供任何实际好处,甚至可能导致问题和错误(通过NullPointerExceptions).
考虑以下两个类:
public class SomeClass
{
public final static int MODE = 1;
private String message;
public SomeClass(String message)
{
this.message = message;
}
}
public class Test
{
public static void main(String[] args)
{
SomeClass myObject = new SomeClass("bla");
System.out.println(myObject.MODE);
System.out.println(OtherClass.MODE);
}
}
这只会打印出来:
1
1
但是,假设您正在执行某些任务,其中您迭代SomeClass对象的列表,其中某些条目可能为null(可能是因为它们在某些时候从集合中删除,或者因为在插入时允许空条目为原因).
在这种情况下,如果您通过实例访问静态成员,您将获得NPE,而通过类本身访问它将按预期工作.
请注意,问题中描述的行为特定于枚举类型本身(即Currency.NICKLE.DIME …).有一种方法可以模仿这种行为,如下所示:
public class SomeClass
{
public static SomeClass REF; // not final anymore since 'this' must be the first line in a constructor call
public String message; // note this is public now
public SomeClass(String message)
{
this.message = message;
}
public void setRef() {
REF = this;
}
}
public class Test
{
public static void main(String[] args)
{
SomeClass myObject = new SomeClass("bla!");
System.out.println(myObject.REF);
System.out.println(SomeClass.REF);
myObject.setRef();
System.out.println(SomeClass.REF);
System.out.println(SomeClass.REF.message);
}
}
这将打印出来:
null
null
SomeClass@... // Object.toString() call
bla!
但是使用这种糟糕的技术和许多缺点绝对没有任何好处.