枚举为实例变量

2022-09-02 12:01:07

如果您有一个枚举,例如

enum Coffee {
    BIG,
    SMALL
}

和一个具有类似枚举的实例变量的类:

public class MyClass {
    private Coffee coffee;

    // Constructor etc.
}

为什么在构造函数中可以说例如?我不明白你可以使用参考?枚举作为实例变量是否初始化为不是 ?这是SCJP书第一章中的自检问题#4。我试图缩短代码和问题。coffee.BIGnull


答案 1

enum Coffee {
    BIG,
    SMALL
}

BIG 或 SMALL 是 Coffee 类的字段,与所有静态字段一样,它们可以通过类名进行访问,例如public static final

Coffee b1 = Coffee.BIG;

或通过与类类型相同的引用,例如

Coffee s2 = b1.SMALL;
Coffee s3 = Coffee.BIG.SMALL; //BIG is reference of type Coffee so it is OK (but looks strange)

但是,请记住,我们应该避免通过引用访问静态成员。这造成了混乱,因为我们不是真正访问实例的成员,而是的成员(例如,没有多态行为)。


答案 2

这是幕后发生的事情:

E:\workspace>type Coffee.java
public enum Coffee {
    BIG,
    SMALL
}

E:\workspace>javap Coffee
Compiled from "Coffee.java"
public final class Coffee extends java.lang.Enum<Coffee> {
  public static final Coffee BIG;
  public static final Coffee SMALL;
  public static Coffee[] values();
  public static Coffee valueOf(java.lang.String);
  static {};
}

如您所见,本质上是枚举中的静态字段。BIGSMALL

JLS也明确了这一部分:

除了枚举类型 E 从枚举继承的成员之外,对于名称为 n 的每个已声明枚举常量,枚举类型还具有一个隐式声明的公共静态最终字段,该字段名为 N,类型为 E。这些字段被视为在枚举类型中显式声明的任何静态字段之前,以与相应的枚举常量相同的顺序声明。每个这样的字段都初始化为与其对应的枚举常量。

希望这能澄清您的问题。