gpt4 book ai didi

java - 枚举变量如何工作?

转载 作者:太空狗 更新时间:2023-10-29 22:46:08 24 4
gpt4 key购买 nike

考虑 enum Animals { DOG, FISH, GOAT }; 在 Java 中。

现在 Animals 类型的变量可以指向该类型的成员对象:

Animals a1 = Animals.DOG; 没问题。

但是下面的链引用是如何有意义的呢?

Animals a2 = a1.DOG.FISH.GOAT;(是的,看起来很疯狂,在棘手的 Java 问题中看到了这一点)

a1 真正 指向什么?我们如何从中引用其他 enum 成员?

示例:

public class EnumTest {
enum Animals { DOG, FISH, GOAT };

public void test(){
Animals a1 = Animals.DOG;
Animals a2 = a1.DOG.FISH.GOAT; //--Strange but valid--
}
}

最佳答案

Java 中 enum 的成员就像类的静态字段,因此 a1.DOGAnimals.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 上,也发生在 class 上:

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,而是像 classes 的问题。

在其他一些语言(例如 C#)中,不允许通过类型的实例引用类型的静态成员,但 Java 是一个异常(exception)。

恕我直言,通过类型的实例引用类型的静态成员应该是一个坏习惯。正如您所指出的那样,这会导致混淆。


如果您喜欢使用 Eclipse IDE,它只会给您一个警告:

The static field Animals.DOG should be accessed in a static way

Eclipse 还为您提供了一些建议。其中之一是更改为使用类型来引用 enum 成员,另一个是删除“字段的静态修饰符”(但实际上对 enums).

添加:

枚举编译的内部结构:

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 {};
}

关于java - 枚举变量如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14011825/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com