2012-04-16 18 views
5

En primer lugar, pido disculpas si este es un duplicado de una pregunta existente. No estaba precisamente seguro de cómo expresar mi pregunta, por lo que puede ser por eso que todavía no he encontrado una respuesta clara. En esencia, me gustaría saber si el siguiente es considerado una buena práctica o si hay una mejor manera de hacer esto:¿Está utilizando una instanciación de objeto como una buena práctica de valor de una entrada enum?

public enum ExampleEnum { 
    ENTRY_1(new ExampleCodedValue("entry1", "comment1")), 
    ENTRY_2(new ExampleCodedValue("entry2", "comment2")), 
    ENTRY_3(new ExampleCodedValue("entry3", "comment3")), 
    ENTRY_4(new ExampleCodedValue("entry4", "comment4")); 

    private ExampleCodedValue codedValue; 

    ExampleEnum(ExampleCodedValue codedValue) { 
     this.codedValue = codedValue; 
    } 

    public ExampleCodedValue getCodedValue() { 
     return codedValue; 
    } 
} 

class ExampleCodedValue { 

    private final String code; 
    private final String comment; 

    ExampleCodedValue(String code, String comment) { 
     this.code = code; 
     this.comment = comment; 
    } 
} 

Respuesta

11

Esa es una forma perfectamente razonable para hacerlo, sin embargo, no has podido hacer esto:

public enum ExampleEnum { 
    ENTRY_1("entry1", "comment1"); 

    private final String entry; 
    private final String comment; 

    private ExampleEnum(String entry, String comment) { 
     ... 
    } 
} 
+1

+1 Principio de KISS. Por cierto, comúnmente creo enums con campos (como este). Pueden ser notablemente útiles. – Bohemian

+0

La razón principal es que esta enumeración, y otras similares, usan un tipo de datos común de 'ExampleCodedValue'. Entonces, por ejemplo, podrías tener dos enumeraciones, 'Configuración' y' Atributos'. Cada uno consiste en un código y un comentario. Es una simplificación excesiva de mi caso de uso real, pero las dos enumeraciones son distintas en términos de lo que encapsulan. También consideré usar el ejemplo de @ Jeffery y tener un método de acceso que devuelva el tipo 'ExampleCodedValue'. Tal vez esa es una mejor manera de hacerlo? – speedRS

+0

@speedRS Me preguntaba por qué se tomaría tantas molestias para crear un objeto que no proporcionara ninguna funcionalidad adicional. Pero dado que su caso de uso exige tener ese objeto en particular, no hay nada de malo en su ejemplo original. – Jeffrey

-1

En primer lugar Por qué no puedes simplemente añadir las propiedades del código y de comentario a la propia enumeración? Parece completamente sin sentido.

1

Está bien, ya que su ExampleCodedValue es inmutable.

Sin embargo, si solo es un contenedor de valores, pregúntese si hay una buena razón para no colocar los campos directamente en el enum. Una buena razón podría ser que su objeto de valor está conceptualmente separado de otros campos de las enumeraciones.

Otro caso de uso para objetos contenidos en enumeraciones es usar polimorfismo para darles a cada uno de ellos una funcionalidad diferente. Por ejemplo:

PAINT_BRUSH(new PaintTool()), 
ERASER(new EraserTool()); 

Con diferentes implementaciones de execute() o así en PaintTool y EraserTool.

En este punto, usted podría preguntarse, sin embargo, sigo usando el enum que hacer una elección en algún lugar, o podría omitir el I enum por completo y sólo utilizar los Tool casos directamente ... Además, tradicionalmente, enumeraciones Don giran en torno a la funcionalidad.

Cuestiones relacionadas