为什么我们允许在Java中引用枚举成员的枚举成员?

时间:2018-05-26 18:58:08

标签: java enums

鉴于以下枚举:

enum Repeat {
    Daily,
    Weekly,
    Yearly
}

我意识到我们能够这样写:

Repeat repeat = Repeat.Daily.Weekly.Yearly.Weekly;

相当于:

Repeat repeat = Repeat.Weekly;

我可以知道为什么允许这样的语法吗?有没有办法让编译器警告我们不要这样做?

4 个答案:

答案 0 :(得分:19)

允许Daily, Weekly, Yearly static default enum 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枚举的字节码检查的一部分,从中可以清楚地看出 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 变量是const walls = Rx.Observable .range(1, 10) .map(() => { return { x: helper.randomIntFromZero(canvas.width - wallWidth), y: helper.randomIntFromZero(canvas.height - wallHeight) }; }) const player = move.map( e => { const coords = { x: 0, y: 0 } if (e.keyCode == 37) { coords.x -= (player.x <= 0) ? 0 : deltaCoord; } if (e.keyCode == 38) { coords.y -= (player.y <= 0) ? 0 : deltaCoord; } if (e.keyCode == 39) { coords.x += (player.x + player.width >= canvas.width) ? 0 : deltaCoord; } if (e.keyCode == 40) { coords.y += (player.y + player.width >= canvas.height) ? 0 : deltaCoord; } return coords; } ) .startWith({ x: 0, y: 0 }) 并且保存了Enum本身的对象。

Rx.Observable.combineLatest((player, walls) => {
    console.log(player, walls);
})
.subscribe((player, walls) => {
    console.log('player', player);
    console.log('walls', walls);
});

答案 1 :(得分:5)

枚举实例只是枚举类的line=1 #initialize your variable at 1 for td in allrows1: td=td.text print (td) ws.cell(row=line, column=1, value=ta) # change 1 with line line += 1 # add one to line for the next iteration 实例。

我们有两种方法来访问类的静态字段:

  1. 通过类itselft:Repeat.Daily
  2. 通过类的实例:Repeat.Daily.Daily
  3. 当你链接你的枚举时:

    static

    就像从类的实例中获取静态字段一样。

答案 2 :(得分:2)

  

有没有办法让编译器警告我们不要这样做?

是,使用好的IDE 并启用警告。这样,在编写代码之前,您会立即收到通知。

E.g。在Eclipse中,它被称为&#34;对静态成员的非静态访问&#34;:

enter image description here

答案 3 :(得分:1)

枚举文字是静态成员,每个静态成员都可以使用类引用访问它们:

TypeName.staticMember
TypeName.staticMethod()

或者在一个实例上:

new TypeName().staticMember
new TypeName().staticMethod()

不建议采用第二种方法(编译器会发出警告)

由于枚举文字只是静态成员,Repeat.Daily.Weekly.Yearly.Weekly就像上面的第二个代码片段,访问实例引用上的静态成员。

有了一个课程,那就是:

class Type {
    static Type INSTANCE1, INSTANCE2, INSTANCE3;
}

可以使用INSTANCE3获取对Type.INSTANCE1.INSTANCE2.INSTANCE3的引用。这是有效的,但这是不好的做法。