2012-04-16 7 views
5

Po pierwsze, przepraszam, jeśli jest to duplikat istniejącego pytania. Nie byłem dokładnie pewien, jak sformułować moje pytanie, więc może dlatego nie znalazłem jeszcze jednoznacznej odpowiedzi. Zasadniczo, chcę wiedzieć, czy następuje za dobre praktyki lub jeśli istnieje lepszy sposób to zrobić:Czy przy użyciu instancji obiektu jako dobrej praktyki wartości wpisu?

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

Odpowiedz

11

To doskonale rozsądny sposób to zrobić, jednak nie można zrobić tak:

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

    private final String entry; 
    private final String comment; 

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

Zasada +1 KISS. BTW Często tworzę wyliczenia z polami (jak to). Mogą być wyjątkowo przydatne. – Bohemian

+0

Głównym powodem jest to, że to wyliczenie i inne podobne, używają typowego typu danych "ExampleCodedValue". Na przykład możesz mieć dwie wyliczenia, "Ustawienia" i "Atrybuty". Każda składa się z kodu i komentarza. To nadmierne uproszczenie mojego rzeczywistego przypadku użycia, ale dwie wyliczenia różnią się od siebie tym, co zawierają. Rozważałem również użycie przykładu @ Jeffery'ego i posiadanie metody dostępowej, która zwraca typ 'ExampleCodedValue'. Może to lepszy sposób na zrobienie tego? – speedRS

+0

@speedRS Zastanawiam się, dlaczego miałbyś zadać sobie trud tworzenia obiektu, który nie zapewniałby dodatkowej funkcjonalności. Ale ponieważ twój przypadek użycia wymaga posiadania tego konkretnego obiektu, nie ma nic złego w twoim oryginalnym przykładzie. – Jeffrey

-1

Po pierwsze, dlaczego nie można po prostu dodać właściwości kodu i komentarz dla samego wyliczenia? Wydaje się zupełnie bezcelowe.

1

To dobrze, ponieważ swoim ExampleCodedValue jest niezmienna.

Jeśli jednak jest to tylko pojemnik wartości, zapytaj się, czy istnieje dobry powód, aby nie umieszczać pól bezpośrednio w enum. Dobrym powodem może być to, że twój obiekt wartości jest koncepcyjnie oddzielony od innych pól elementów.

Innym przypadkiem użycia obiektów zawartych w enums jest użycie polimorfizmu, aby nadać każdej z nich inną funkcjonalność. Na przykład:

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

z różnymi implementacjami execute() lub tak w PaintTool i EraserTool.

W tym momencie można zadać sobie chociaż, ja nadal używa enum dokonać wyboru gdzieś, czy mogę pominąć enum całkowicie i bezpośrednio po prostu użyć Tool instancje ... Również tradycyjnie wyliczenia don Obraca się wokół funkcjonalności.