Ответ 1
Члены enum
в Java похожи на статические поля класса, поэтому 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
, наконец, скомпилируется в класс со статическими полями, поэтому это не проблема enum
s, а скорее проблема с class
х годов.
В некоторых других языках (например, С#) вам не разрешается ссылаться на статический член типа через экземпляр типа, но Java является исключением.
ИМХО, ссылающееся на статический член типа через экземпляр типа, должно быть плохой привычкой. Это вызывает путаницу, как вы указали.
Если вам нравится использовать Eclipse IDE, он просто даст вам предупреждение:
Статическое поле Animals.DOG должно быть доступно статическим способом
Eclipse также предлагает несколько предложений для вас. Одним из них является переход на использование типа для ссылки на элемент enum
, а другой - на удаление "статического модификатора поля" (но фактически не работает на enum
s).
Дополнение:
Внутренняя структура того, что компиляция перечисляет:
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 {};
}