究竟什么是Enum?

Alb*_*ish 0 java

现在我想弄清楚java中的Enum到底是什么.我知道它们是如何工作的以及如何/何时使用它们但是我对它们究竟是什么有点不清楚.基于他们的行为,在我看来,他们只不过是一个私有构造函数的类.然而,在我看来,编译器正在对它们做一些特殊的事情,因为Enums有一个特殊的方法values(),它不会出现在Oracle doc站点的Enum类中.

我的问题是,Enums究竟是什么以及编译器如何解释它们?

sig*_*ned 5

如前所述,An enum是一个继承自Enum类的类(a)private构造函数; (b)命名的final实例的固定列表.

在幕后,当您声明enum:

public enum Foo {
    A(1) {
        public void bar() {
            System.out.println("A#bar");
        }
    },
    B(2) {
        public void bar() {
            System.out.println("B#bar");
        }
    },
    C(3) {
        public void bar() {
            System.out.println("C#bar");
        }
    };

    private Foo(int x) {
        // Code goes here...
    }

    public abstract void bar();
}
Run Code Online (Sandbox Code Playgroud)

...你可以想象编译器生成这样的东西:

public class Foo extends Enum<Foo> {
    public static final Foo A=new Foo(1) {
        public void bar() {
            System.out.println("A#bar");
        }
    };
    public static final Foo B=new Foo(2) {
        public void bar() {
            System.out.println("B#bar");
        }
    };
    public static final Foo C=new Foo(3) {
        public void bar() {
            System.out.println("C#bar");
        }
    };

    private Foo(int x) {
        // Code goes here...
    }
}
Run Code Online (Sandbox Code Playgroud)

还有其他一些enum特别之处:

  1. 编译器知道enums有一个固定的实例列表.如果switch没有case处理每个值的语句,这允许它执行诸如发出警告之类的操作.
  2. 每个常量都有一个特殊的,编译器生成的,基于0的,单调递增的密集ordinal()值.(换句话说,第一个具有序数0,然后第二个具有序数1,依此类推.)这允许创建非常有效的基于阵列的数据结构EnumMap.

我确定我错过了一些东西,但这是一个很好的起点.