Java 枚举作为实例变量

Java 枚举作为实例变量,java,enums,scjp,Java,Enums,Scjp,如果您有一个枚举,例如 enum Coffee { BIG, SMALL } 还有一个类,它有一个类似于枚举的实例变量: public class MyClass { private Coffee coffee; // Constructor etc. } 为什么构造器中可以说,例如,coffee.BIG? 我不明白你能用参考资料吗?是否将枚举作为实例变量初始化为非null?这是SCJP第一章书中的自测题#4。我试图缩短代码和问题。在Java 5之前,实现枚

如果您有一个枚举,例如

enum Coffee {
    BIG,
    SMALL
}
还有一个类,它有一个类似于枚举的实例变量:

public class MyClass {
    private Coffee coffee;

    // Constructor etc.
}
为什么构造器中可以说,例如,
coffee.BIG

我不明白你能用参考资料吗?是否将枚举作为实例变量初始化为非
null
?这是SCJP第一章书中的自测题#4。我试图缩短代码和问题。

在Java 5之前,实现枚举的方法是创建一个类,将同一类的私有构造函数和公共final字段初始化为特定值


由于Java 5,enum构造实际上是一种糖,它也可以做到这一点,并且可以处理诸如不允许使用空值、enum值成为公共静态字段等问题。

这就是幕后发生的事情

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 {};
}
E:\workspace>type Coffee.java
公共咖啡{
大的
小的
}
E:\workspace>javap咖啡
从“Coffee.java”编译而来
公共最终类扩展java.lang.Enum{
公共静态最终咖啡大;
公共静态最终咖啡小;
公共静态咖啡[]值();
公共静态咖啡值(java.lang.String);
静态{};
}
正如您所看到的,
BIG
SMALL
基本上是枚举中的静态字段

政府亦清楚说明这部分:

除了枚举类型E从枚举继承的成员之外, 对于每个名为n的已声明枚举常量,枚举类型具有 隐式声明的公共静态final字段名为n,类型为E 字段的声明顺序与 对应的枚举常量,显式位于任何静态字段之前 在枚举类型中声明。每个这样的字段都初始化为枚举 与之对应的常数

希望这能澄清您的问题。

enum Coffee {
    BIG,
    SMALL
}
大或小是Coffee类的
公共静态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)
但是请记住,我们应该避免通过引用访问静态成员。这会造成混乱,因为我们实际上不是在访问实例的成员,而是在访问类的成员(例如,不存在多态行为)