为什么不能在Java中保护枚举构造函数或公开?

Bad*_*est 69 java enums constructor

整个问题在标题中.例如:

enum enumTest {

        TYPE1(4.5, "string1"), TYPE2(2.79, "string2");
        double num;
        String st;

        enumTest(double num, String st) {
            this.num = num;
            this.st = st;
        }
    }
Run Code Online (Sandbox Code Playgroud)

构造函数可以使用默认值或private修饰符,但如果给定publicprotected修饰符,则会给出编译器错误.

jjn*_*guy 95

将Enums视为具有有限数量实例的类.除了您最初声明的实例之外,永远不会有任何不同的实例.

因此,您不能拥有公共或受保护的构造函数,因为这将允许创建更多实例.

注意:这可能不是官方原因.但是对我来说这是最有意义的enums.

  • 它确实很有意义.但那为什么要允许"默认"呢?因为同一个包中的其他类也可以调用构造函数. (12认同)
  • @Anita,所有接口方法都是公共的和抽象的...所以在接口Runnable(void run();}中,run方法是公共的和抽象的.也许java设计者为枚举构造函数做了同样的事情(无论是否为私有)你把他们标记为私人). (9认同)
  • @Anita见Daniel的回答."你不能自己调用​​枚举构造函数." (3认同)
  • 实际上,枚举构造函数只允许使用私有访问修饰符."如果没有为枚举类型的构造函数指定访问修饰符,则构造函数是私有的." - JLS http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.3 (3认同)
  • 是啊.我在OP中编译并运行了代码示例.没有错误.但奇怪的是我仍然无法手动调用构造函数,即使默认情况下也是如此.我认为默认意味着只要你在同一个包中,就可以访问它?我在这里错过了一些大事吗? (2认同)
  • 枚举类的所有构造函数都是隐式私有的,即使省略了private修饰符. (2认同)

Cri*_*hez 19

因为你不能自己调用​​构造函数.

这是关于Enums教程必须说的:

注意:枚举类型的构造函数必须是包私有或私有访问.它会自动创建在枚举主体开头定义的常量.您不能自己调用​​枚举构造函数.

  • 但另一方面,这种限制并没有真正解释为什么*我们不能拥有公共或受保护的枚举构造函数.允许两个访问修饰符中的四个,这有点奇怪和不一致; 允许所有访问修饰符(因为你仍然无法调用构造函数)或者只允许一个(最佳候选者是"私有" - 指出无法从其他地方访问 - 或者可能是默认值)更有意义,以减少代码噪音). (9认同)

har*_*rto 8

枚举包含一组固定的值,这些值必须在编译时都知道.在运行时创建新文字是没有意义的,如果构造函数是可见的,这是可能的.