2012-04-16 3 views
5

Prima di tutto, ci scusiamo se si tratta di un duplicato di una domanda esistente. Non sapevo esattamente come pronunciare la mia domanda, quindi potrebbe essere il motivo per cui non ho ancora trovato una risposta chiara. In sostanza, voglio sapere se quanto segue è considerato buona pratica o se c'è un modo migliore per fare questo:L'utilizzo di un'istanza di oggetti come valore di una voce enum è una buona pratica?

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

risposta

11

Questo è un modo perfettamente ragionevole per farlo, tuttavia, non si potrebbe fare questo:

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

    private final String entry; 
    private final String comment; 

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

+1 principio KISS. BTW Generalmente creo enum con campi (come questo). Possono essere notevolmente maneggevoli. – Bohemian

+0

Il motivo principale è che questo enumerato, e altri simili, usano un tipo di dati comune di 'ExampleCodedValue'. Ad esempio, potresti avere due enumerazioni, "Impostazioni" e "Attributi". Ciascuno è composto da un codice e un commento. È una semplificazione eccessiva del mio caso d'uso reale ma le due enumerazioni sono distinte in termini di ciò che incapsulano. Ho anche considerato di utilizzare l'esempio di @ Jeffery e di avere un metodo accessor che restituisce il tipo 'ExampleCodedValue'. Forse è un modo migliore di farlo? – speedRS

+0

@speedRS Mi stavo chiedendo perché avresti fatto tutto il possibile per creare un oggetto che non offrisse funzionalità aggiuntive. Ma dal momento che il tuo caso d'uso richiede di avere quell'oggetto particolare, non c'è niente di sbagliato nel tuo esempio originale. – Jeffrey

-1

In primo luogo Perchè non è sufficiente aggiungere le proprietà del codice e di commento al enum stessa? Sembra completamente inutile.

1

Va bene, dal momento che il ExampleCodedValue è immutabile.

Tuttavia, se si tratta solo di un contenitore di valori, chiedersi se esiste una buona ragione per non inserire direttamente i campi nello enum. Una buona ragione potrebbe essere che il tuo oggetto valore è concettualmente separato dagli altri campi dell'enumerazione.

Un altro caso di utilizzo per gli oggetti contenuti nelle enumerazioni consiste nell'utilizzare il polimorfismo per conferire a ciascuna di esse funzionalità diverse. Ad esempio:

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

Con differenti implementazioni di execute() o così in PaintTool e EraserTool.

A questo punto, si potrebbe chiedere a te stesso, però, sto ancora utilizzando il enum di fare una scelta da qualche parte, o potrei omettere il enum del tutto e basta usare le Tool casi direttamente ... Inoltre, tradizionalmente, enumerazioni don ruotano attorno alla funzionalità.