2011-10-12 13 views
44

Dado que un constructor enum solo puede invocarse mediante sus constantes, ¿por qué se permite que sea privado del paquete?¿Por qué una enumeración tiene un constructor privado de paquetes?

+7

para permitir a ahorrar un poco de espacio de código y evitar la verbosidad innecesaria (como las interfaces no necesitan 'abstract' pública antes de cada método) –

+0

@ratchetfreak: Es no como las interfaces. Los métodos de interfaz son * siempre * 'público resumen'. Hacer los modificadores explícitos está permitido, pero no hay forma de cambiarlos. –

+0

@RyanStewart tampoco hay forma de que llame a un constructor enum para que sea lógicamente privado y permita que el paquete privado permita guardar esos pocos caracteres –

Respuesta

70

El constructor en realidad no es un paquete privado ... implícitamente es private la forma en que los métodos de interfaz son implícitamente public incluso si no agrega la palabra clave.

La sección correspondiente de la JLS (§8.8.3) afirma:

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 .

+4

cita: http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 –

+0

@Ryan Stewart: Gracias por encontrar eso. – ColinD

2

Es una peculiaridad de la lengua: constructores de enumeración son implícitamente privado.

Curiosamente, si se declara un constructor enum paquete visible, así:

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

    private final int i; 

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

    public int getI() { 
     return i; 
    } 
} 

no puede referirse a ella de otra clase en el paquete. Si lo intenta, se obtiene el error del compilador:

Cannot instantiate the type MyEnum

+0

Aparentemente puede intentar esto con enum siendo clase anidada estática o en un método de la enumeración. Sí, la compilación falla con dicho error. – Vlasec

+0

"si declaras un constructor enum visible para el paquete" ... pero en realidad no hay forma de hacerlo. – raghavsood33

+0

@ raghavsood33 sí puedes. Vea el código compilable que agregué a mi respuesta que demuestra un constructor visible para el paquete. – Bohemian

Cuestiones relacionadas