0

现在我正试图弄清楚java中的枚举到底是什么。我知道它们是如何工作的以及如何/何时使用它们,但是我有点不清楚它们到底是什么。根据他们的行为,在我看来,他们只不过是一个带有私有构造函数的类。然而,在我看来,编译器对它们做了一些特别的事情,因为 Enums 有一个特殊的方法values(),它没有出现在 Oracle 文档网站上的 Enum 类中。

我的问题是,枚举到底是什么,编译器如何解释它们?

4

1 回答 1

5

An是一个从具有(a)构造函数enum的类继承的类,如您所提到的;(b) 命名实例的固定列表。Enumprivatefinal

在幕后,当你声明一个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...
    }
}

还有一些其他的东西让enums 变得特别:

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

我确定我遗漏了一些东西,但这是一个很好的起点。

于 2013-07-10T23:55:22.303 回答