[英]Why do we allow referring to an enum member of an enum member in Java?
鉴于以下枚举:
enum Repeat {
Daily,
Weekly,
Yearly
}
我意识到我们能够这样写它:
Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;
这相当于:
Repeat repeat = Repeat.Weekly;
我可以知道为什么允许这样的语法吗? 有没有办法让编译器警告我们不要这样做?
这是允许的,因为Daily, Weekly, Yearly
都是enum
default
的static
字段,并保持Repeat
的对象。 此外,您将收到编译器的警告"The static field Repeat.Weekly should be accessed in a static way"
。 它类似于下面的代码行。
class Foo{
public static Foo obj1 = new Foo();
public static Foo obj2 = new Foo();
public static Foo obj3 = new Foo();
}
Foo f = Foo.obj1.obj2.obj3; // will work fine but you will get a warning from the compiler.
下面是Repeat
枚举的字节码检查的一部分,从中可以清楚地看出, Enum
变量是static
并且保存Enum本身的对象。
0: new #1 // class com/java8/demo/Repeat
3: dup
4: ldc #14 // String Daily
6: iconst_0
7: invokespecial #15 // Method "<init>":(Ljava/lang/String;I)V
10: putstatic #19 // Field Daily:Lcom/java8/demo/Repeat;
13: new #1 // class com/java8/demo/Repeat
枚举实例只是枚举类的static
实例。
我们有两种访问类的静态字段的方法:
链接枚举时:
Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;
就像从类的实例中获取静态字段一样。
有没有办法让编译器警告我们不要这样做?
是的, 使用一个好的IDE并打开警告。 这样,在编写代码之前,您将立即收到通知,然后再进行编译。
例如,在Eclipse中 ,它被称为“对静态成员的非静态访问”:
枚举文字是静态成员,每个静态成员都可以使用类引用访问它们:
TypeName.staticMember
TypeName.staticMethod()
或者在一个实例上:
new TypeName().staticMember
new TypeName().staticMethod()
不鼓励使用第二种方法(编译器会发出警告)
因为枚举文字只是静态成员, Repeat.Daily.Weekly.Yearly.Weekly
就像上面的第二个代码片段,访问实例引用上的静态成员。
有了课程,那就是:
class Type {
static Type INSTANCE1, INSTANCE2, INSTANCE3;
}
并且可以使用Type.INSTANCE1.INSTANCE2.INSTANCE3
获取对INSTANCE3
的引用。 这是有效的,但这是不好的做法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.