2011-06-26 11 views
9

¿Qué es una buena práctica al definir una enumeración?Prácticas Enum - Definir dentro de una clase/separadamente, hacer público/privado

Por ejemplo, tengo una clase Person. Para esta clase he elegido usar una enumeración que tiene los valores MASCULINO y FEMENINO.

¿Debería definirse la enumeración dentro de la clase Persona o por separado? ¿Debería definirse la enumeración como privada o pública? Además, ¿tiene algún otro consejo que haga que usar una enumeración sea lo más flexible posible?

Respuesta

8

en mi humilde opinión, que sea un public static enum dentro de class Person.

La razón es que enum Gender se aplica solo a Persona, así que colóquelo ahí para que estén unidos (el género no tiene uso sin el contexto de una Persona).

La ventaja:

  • menos clase hinchazón
  • si se mueve la persona a otro paquete/proyecto, Género siempre vienen con él
  • persona, que es el único usuario, tiene "control" de la misma y puede alterar, ya que quiere, por ejemplo
    • añadiendo private List<HealthIssue> genderSpecificHealthIssues;
    • la adición de más enumeraciones, por ejemplo TRANSGENDER, INTERSEX, o lo que sea

El único inconveniente es que debe utilizar una importación static utilizarlo, es decir import static com.company.Person.Gender.*;.

Este patrón se observa en muchas clases de JDK, como Calendar que define las muchas constantes relacionados con la fecha que utiliza dentro la clase.

3

Para una flexibilidad total, agréguelo a una clase estática. Pero, por supuesto, esto es único y exclusivo para las enumeraciones que deben utilizarse a lo largo de toda la aplicación. Para enumeraciones locales y especializadas, es mejor mantenerlas "cerca" de donde se usarán. Exampli gratia, tengo una clase IPHandler que hace que el manejo, el análisis sintáctico y la traducción de las direcciones IPv4 e IPv6 sean transparentes para el usuario de la clase (IPHandler es una clase estática). Tiene una enumeración, IPType, con los valores IPv4 e IPv6 que solo se usan en IPHandler para varias operaciones. Como no se usa en ningún otro lado, se ha definido dentro de la clase IPHandler.

+0

@leon: Gracias por compartir. Solo para confirmar, IPType no se usa en setters/getters y se define como privado. –

+0

@James P. - dado que las llamadas a métodos de IPHandler usan la enumeración (como en _IPHandler.getFormattedLocal (** IPHandler.IPType ipType **)) _, deben ser accesibles desde fuera de su clase principal. Esto significa que no, no pueden ser privados, y no deberían tener instaladores. ¿Eso lo permite Java? – leon

+0

Ok, te entiendo. Cuando mencioné getters y setters quise decir los de su clase IPHandler. Es necesario tener el enum establecido como públicamente accesible si se hace referencia a ellos en los métodos. Esto me deja preguntándome en qué casos sería una buena idea definir una enumeración como un archivo separado de Java. P.S: Solo por el detalle, las enumeraciones pueden tener variables/métodos agregados, aunque obviamente no pueden modificar los valores enum reales. –

Cuestiones relacionadas