究竟什么是Enum?

时间:2013-07-10 23:49:44

标签: java

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

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

1 个答案:

答案 0 :(得分:5)

正如您所提到的,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();
}

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

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...
    }
}

还有一些其他因素使enum变得特别:

  1. 编译器知道enum有一个固定的实例列表。这允许它在switch没有{{case时执行发出警告的操作。 1}}语句来处理每个值。
  2. 每个常量都有一个特殊的,编译器生成的,基于0的,单调递增的,密集ordinal()的值。(换句话说,第一个有序数0,那么第二个有序数1,依此类推。)这样可以创建非常有效的基于数组的数据结构,如EnumMap
  3. 我确定我错过了一些事情,但这是一个很好的起点。