为什么我们允许在Java中引用枚举成员的枚举成员?
给定以下枚举:为什么我们允许在Java中引用枚举成员的枚举成员?,java,enums,Java,Enums,给定以下枚举: enum Repeat { Daily, Weekly, Yearly } 我意识到我们可以这样写: Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly; 这相当于: Repeat repeat = Repeat.Weekly; 我可以知道为什么允许使用这种语法吗?有没有办法让编译器警告我们不要这样做?枚举文本是静态成员,对于每个静态成员,可以使用类引用访问它们: TypeName.staticMemb
enum Repeat {
Daily,
Weekly,
Yearly
}
我意识到我们可以这样写:
Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;
这相当于:
Repeat repeat = Repeat.Weekly;
我可以知道为什么允许使用这种语法吗?有没有办法让编译器警告我们不要这样做?枚举文本是静态成员,对于每个静态成员,可以使用类引用访问它们:
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
可以获得对实例3
的引用。这是有效的,但它是不好的做法。这是允许的,因为每日、每周、每年
是枚举中默认值的静态字段,并保存重复的对象。此外,您将从编译器中得到一条警告:“静态字段Repeat.Weekly应以静态方式访问”
。它类似于下面的代码行
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的字节码检查的一部分,从中可以清楚地看出enum
变量是静态的
,并且保存着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
0:new#1//classcom/java8/demo/Repeat
3:dup
4:ldc#14//String Daily
6:iconst_0
7:invokespecial#15//Method“”:(Ljava/lang/String;I)V
10:putstatic#19//每日字段:Lcom/java8/demo/Repeat;
13:new#1//class com/java8/demo/Repeat
Enum实例只是Enum类的静态
实例
访问类的静态字段有两种方法:
通过课堂本身:每天重复
通过类实例:Repeat.Daily.Daily
链接枚举时:
Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;
这就像从类的实例中获取静态字段一样
有没有办法让编译器警告我们不要这样做
是,使用良好的IDE并打开警告。这样,在编写代码时,甚至在编译之前,您都会收到通知
例如,在中,它被称为“对静态成员的非静态访问”:
有没有办法让编译器警告我们不要这样做?
您应该对此进行配置。