64

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

4

2 回答 2

100

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

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

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

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

如果声明了枚举类型(第 8.9 节)的构造函数publicprotected.

于 2011-10-13T00:44:21.547 回答
5

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

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

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

    private final int i;

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

    public int getI() {
        return i;
    }
}

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

无法实例化类型 MyEnum

于 2011-10-13T02:01:01.693 回答