我偶然发现了这一点,并且想知道java是否允许它。
以下是我的意思的样本:
public enum Days {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}
public class EnumTest {
public static void main(String[] args) {
methodThatDoesSomething(Days.FRIDAY);
}
public static void methodThatDoesSomething(Days day){
System.out.println(day);
}
}
这是FRIDAY
的输出,正如预期的那样。
如果我更改代码:
public class EnumTest {
public static void main(String[] args) {
methodThatDoesSomething(Days.FRIDAY.MONDAY);
}
public static void methodThatDoesSomething(Days day){
System.out.println(day);
}
}
此输出为MONDAY
。
我也收到警告:
应以静态方式访问静态字段Days.MONDAY
但它仍在编译并运行。
可以使用多个枚举参考的任何示例都将非常感激。
答案 0 :(得分:9)
这不是enums的问题 - 它只是任何静态成员(不幸的是)通过该类型的表达式有效。最常见的例子是:
Thread thread = new Thread(...);
thread.start();
thread.sleep(1000); // This doesn't do what it looks like
对于更接近原作的非枚举示例,它基本上是这样的:
class Foo {
public static final Foo X = null;
public static final Foo Y = new Foo();
}
public class Test {
public static void main(String[] args) {
Foo foo = Foo.X.Y;
}
}
请注意,即使Foo.X
为空,也不会在此处获得空指针异常,但奇怪的是,生成的代码 仍然访问Foo.X
,然后才完全忽略它。就像它写的一样:
Foo ignored = Foo.X;
Foo foo = Foo.Y;
基本上,这是Java语言设计中的错误步骤,现在修复它已经太晚了 - 我们能做的最好的事情是获取警告,然后修复代码以通过类名访问静态成员。
答案 1 :(得分:2)
代码按预期工作,但不是你真正要求的。
Days.FRIDAY.MONDAY
就像
Days.MONDAY
但是应该从非静态引用而不是静态引用访问MONDAY
(这就是警告的原因)
答案 2 :(得分:1)
枚举实际上是一个具有特殊语法糖的类,以使其使用更简单。
您实际上正在访问实际为Enum的Days实例,然后访问该实例的静态类成员。
因此,由于类层次结构和Java的类静态成员处理,这是可能的。