我偶然发现了这一点,并且想知道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);
}
}
Run Code Online (Sandbox Code Playgroud)
FRIDAY正如预期的那样,输出就是这样.
如果我像这样更改代码:
public class EnumTest {
public static void main(String[] args) {
methodThatDoesSomething(Days.FRIDAY.MONDAY);
}
public static void methodThatDoesSomething(Days day){
System.out.println(day);
}
}
Run Code Online (Sandbox Code Playgroud)
这个输出是MONDAY.
我也收到警告:
应以静态方式访问静态字段Days.MONDAY
但它仍然编译和运行.
任何可以使用这个多枚举参考的例子都将非常感激.
这不是一个特别的问题 - 它只是关于任何静态成员(不幸的是)通过该类型的表达式有效.最常见的例子是:
Thread thread = new Thread(...);
thread.start();
thread.sleep(1000); // This doesn't do what it looks like
Run Code Online (Sandbox Code Playgroud)
对于更接近原始的非枚举示例,它基本上是这样的:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,即使Foo.X是空,你没有得到一个空指针异常这里,虽然奇怪生成的代码确实仍然获得Foo.X完全无视它.好像它是写的:
Foo ignored = Foo.X;
Foo foo = Foo.Y;
Run Code Online (Sandbox Code Playgroud)
基本上,这是Java语言设计中的错误步骤,现在修复它已经太晚了 - 我们能做的最好的事情是获取警告,然后修复代码以通过类名访问静态成员.
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |