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

时间:2011-10-12 23:57:06

标签: java enums package-private

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

2 个答案:

答案 0 :(得分:87)

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

JLS的相关部分(§8.8.3)声明:

  

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

     

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

     

如果枚举类型(第8.9节)的构造函数声明为publicprotected,则为编译时错误。

答案 1 :(得分:4)

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

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

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

    private final int i;

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

    public int getI() {
        return i;
    }
}

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

  

无法实例化MyEnum类型