为什么枚举有一个包私有构造函数?

Tob*_*ias 55 java enums package-private

由于枚举构造函数只能由其常量调用,为什么它允许是包私有的?

Col*_*inD 91

构造函数实际上不是包私有的...... 即使你不添加关键字,private隐式地public也是隐式的接口方法.

JLS(§8.8.3)的相关部分指出:

如果没有为普通类的构造函数指定访问修饰符,则构造函数具有默认访问权限.

如果没有为枚举类型的构造函数指定访问修饰符,则构造函数为private.

它是一个编译时间错误,如果枚举类型(§8.9)的构造被声明publicprotected.

  • 引用:http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 (4认同)

Boh*_*ian 5

这是该语言的一个怪癖:枚举构造函数是隐式私有的。

有趣的是,如果您声明一个包可见的枚举构造函数,如下所示:

public enum MyEnum {
    A(0),
    B(1);

    private final int i;

    MyEnum(int i) {
        this.i = i;
    }

    public int getI() {
        return i;
    }
}
Run Code Online (Sandbox Code Playgroud)

您不能从包中的另一个类引用它。如果您尝试,您会收到编译器错误:

无法实例化类型 MyEnum

  • “如果你声明一个包可见的枚举构造函数”......但实际上没有办法做到这一点。 (2认同)