2010-09-08 20 views
53

Toda la pregunta está en el título. Por ejemplo:¿Por qué los constructores enum no pueden ser protegidos o públicos en Java?

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; 
     } 
    } 

El constructor está muy bien con el valor predeterminado o private modificador, pero me da un error de compilación si se dan las publicprotected o modificadores.

Respuesta

72

Piense en Enums como una clase con un número finito de instancias. Nunca puede haber instancias diferentes al lado de las que inicialmente declaras.

Por lo tanto, no puede tener un constructor público o protegido, porque eso permitiría crear más instancias.

Nota: probablemente esta no sea la razón oficial. Pero tiene más sentido para mí pensar en enums de esta manera.

+10

Tiene mucho sentido. Pero entonces, ¿por qué debería permitirse "default"? Porque entonces otras clases en el mismo paquete pueden invocar también al constructor. –

+0

@Anita, ¿está seguro de que está permitido? – jjnguy

+1

Sí.Recopilé y ejecuté la muestra del código en el PO. Sin errores. Pero lo curioso es que aún no puedo llamar manualmente al constructor, incluso de manera predeterminada. Pensé que, por defecto, siempre que estés en el mismo paquete, ¿puedes acceder a él? ¿Me estoy perdiendo algo grande aquí? –

16

Porque no puede llamar al constructor usted mismo.

Esto es lo que la tutorials on Enums tiene que decir:

Nota: El constructor para un tipo de enumeración debe ser paquete privado o de acceso privado. Crea automáticamente las constantes que se definen al comienzo del cuerpo enum. No puede invocar un constructor enum usted mismo.

+0

Tomado del enlace proporcionado por Daniel "Nota: El constructor para un tipo de enumeración debe ser privado o de paquete privado. Crea automáticamente las constantes que se definen al principio del cuerpo de enumeración. No puede invocar un constructor enum usted mismo " Como no puede llamarlo usted mismo, no importa por qué puede ser un paquete privado. – Syntax

+8

Pero, por otro lado, esta restricción realmente no explica * por qué * no podemos tener constructores enum públicos o protegidos. Es un poco extraño e inconsistente permitir dos modificadores de acceso de cuatro; tendría más sentido permitir todos los modificadores de acceso (porque todavía no puedes llamar al constructor) o simplemente permitir uno (los mejores candidatos son 'privados '- para señalar que no se puede acceder desde otro lugar) o por defecto , para reducir el ruido del código). – gustafc

+1

@gustafc: ¡mis sentimientos exactamente! –

6

Las enumeraciones contienen un conjunto de valores fijos, que deben conocerse en tiempo de compilación. No tiene sentido crear nuevos literales en tiempo de ejecución, lo que sería posible si el constructor fuera visible.

-3

si desea declarar enum público, guarde el archivo enum con el nombre enum.

Suponga que ha hecho una enumeración Book{} guárdelo por Book.java y crea un archivo separado para la clase

esta es la única manera de declarar enum pública.

+3

La pregunta era sobre el constructor, no el Enum ellos mismos. – madth3

0

El punto clave a recordar es que un enumeraciones que no está encerrado en una clase se pueden declarar con sólo el modificador pública o predeterminado, al igual que una clase no interior.

+0

Una vez más, esta pregunta es sobre enum * construcctors *, no sobre los tipos enum. –

Cuestiones relacionadas