Javaの のメンバーはenum
、クラスの静的フィールドに似ているため、a1.DOG
単に と同じAnimals.DOG
です。
public class EnumTest {
enum Animals { DOG, FISH, GOAT };
public void test(){
Animals a1 = Animals.DOG;
Animals a2 = a1.DOG; // the same as Animals.DOG, but makes code messy
Animals a3 = a1.DOG.FISH; // WTF chaining???
}
}
これはenum
s だけでなくclass
es でも発生します。
public class A {
public static A a_1;
public static A a_2;
public void boo() {
A a = A.a_1;
A b = a.a_1; // That makes a equal to b!
A c = a.a_1.a_2; // I HATE "CHAINING" LIKE THIS
}
}
@lichengwuが回答で指摘したように、enum
sは最終的に静的フィールドを持つクラスにコンパイルされるため、これはsの問題ではなく、 esenum
の問題に似ています。class
他の一部の言語 (C# など) では、型のインスタンスを介して型の静的メンバーを参照することはできませんが、Java は例外です。
タイプのインスタンスを介してタイプの静的メンバーを参照する私見は、悪い習慣です。ご指摘のように混乱を招きます。
Eclipse IDE を使用したい場合は、単純に警告が表示されます。
静的フィールド Animals.DOG は、静的な方法でアクセスする必要があります
Eclipse は、いくつかの提案も提供します。そのうちの 1 つは型を使用してメンバーを参照するように変更することenum
であり、もう 1 つは「フィールドの静的修飾子」を削除することです (ただし、実際にはenum
s では機能しません)。
添加:
Enumeration がコンパイルされるものの内部構造:
final class Animals extends java.lang.Enum<Animals> {
public static final Animals DOG;
public static final Animals FISH;
public static final Animals GOAT;
public static Animals[] values();
public static Animals valueOf(java.lang.String);
static {};
}