Why can a enum have a package-private constructor?

后端 未结 2 990
孤街浪徒
孤街浪徒 2020-11-29 05:36

Since an enum constructor can only be invoked by its constants, why is it then allowed to be package-private?

相关标签:
2条回答
  • 2020-11-29 06:20

    It's a quirk of the language: enum constructors are implicitly private.

    Interestingly, if you declare a package-visible enum constructor, like this:

    public enum MyEnum {
        A(0),
        B(1);
    
        private final int i;
    
        MyEnum(int i) {
            this.i = i;
        }
    
        public int getI() {
            return i;
        }
    }
    

    you can't refer to it from another class in the package. If you try, you get the compiler error:

    Cannot instantiate the type MyEnum

    0 讨论(0)
  • 2020-11-29 06:25

    The constructor actually isn't package-private... it's implicitly private the way interface methods are implicitly public even if you don't add the keyword.

    The relevant section of the JLS (§8.8.3) states:

    If no access modifier is specified for the constructor of a normal class, the constructor has default access.

    If no access modifier is specified for the constructor of an enum type, the constructor is private.

    It is a compile-time error if the constructor of an enum type (§8.9) is declared public or protected.

    0 讨论(0)
提交回复
热议问题