2012-07-09 16 views
10

Po przeczytaniu kilku pytań i odpowiedzi na temat enum nie wydaje mi się to zbyt użyteczne ...Do czego służy Enum?

To coś pomiędzy klasą a zmienną, ale wiem, gdzie mogę go użyć, aby był bardziej przydatny niż klasa, lub na przykład kilka zmiennych.

+6

http://stackoverflow.com/questions/481068/when-to-use-enum-or-collection-in-java – Habib

+1

http://stackoverflow.com/questions/2077634/enum-in-java-advantages – assylias

Odpowiedz

32

Są inne rzeczy, które można zrobić i powody ich używania, ale głównym powodem, dla którego używam wyliczeń, jest zapobieganie możliwości wprowadzenia nieprawidłowego parametru. Na przykład, wyobraźmy sobie następującą metodę:

public void doSomethingWithAMonth(int monthNum); 

To nie jest tylko wieloznaczne (? Zrobić miesiąc indeksy zaczynają się od 1, lub na 0), ale można dać w dół-prawo nieprawidłowe dane (13+, liczby ujemne) . Jeśli masz enum Month z sty, luty itd podpis staje:

public void doSomethignWithAMonth(Month month); 

Kod wywołanie tej metody będzie znacznie bardziej czytelne i nie może zapewnić nieprawidłowe dane.

+1

Dzięki! Teraz myślę, że rozumiem to trochę lepiej :) –

+1

To jest prosty i dobry przykład. – njfife

2

Podobnie jak nazwa "enum", idealnie nadaje się do stałych wyliczeniowych, które zapewniają rozszerzoną funkcjonalność. Na przykład możesz przechowywać pewne stałe zawierające od kilku parametrów, takich jak: constantId, constanNameString, dodatkowe parametry. Dodatkowo enum może zawierać funkcje.

Egzotyczne użycie enum polega na tworzeniu singletonu.

4

Zmusza koderów do wybrania z wcześniej zdefiniowanej listy elementów lub pojęć. Chociaż można osiągnąć ten sam cel w przypadku klas lub ustawienia zmiennej do konkretnej znanej wartości, wyliczenie jest mniej podatne na błędy, ponieważ reklamuje i wymusza menu, z którego może wybrać ustawnik wartości.

4

Enum jest użyteczne, aby uniemożliwić ludziom robienie rzeczy, których nie powinni robić. Na przykład, jeśli mam:

public final static int WEATHER_SUNNY = 0; 
public final static int WEATHER_RAINY = 1; 
public final static int WEATHER_HAIL = 2; 

wtedy mogę zrobić: MyClass.WEATHER_SUNNY + MyClass.WEATHER_HAIL który nie ma sensu. Dlatego lepiej mieć wyliczenie pogody. Sprawia to, że kod jest bardziej czytelny i uniemożliwia sumowanie dwóch zmiennych pogodowych.

+0

Nie jestem wielkim fanem tego przykładu, choćby dlatego, że uważam, że to zachęca do myślenia wąsko rozumianego. Nie ma powodu, by różne typy pogody, takie jak te, nie mogą się pokrywać, w rzeczywistości często się zdarzają. – Thor84no

+0

@ Thor84no: dzięki za komentarz. Wszystko zależy jednak od domeny i aplikacji, więc mówi się na przykład "zachęca do myślenia wąsko rozumianego". nie wydaje się właściwe. –

10

Używam Enums dla wszystkiego, co ma wiele niezmienny "typ" coś. tj. dni tygodnia.

Dlaczego nie używam String w tym przypadku, ponieważ nie mogę wykonać instrukcji switch na String i mogę na Enum, więc na każdy dzień tygodnia mogę zrobić coś konkretnego.

Używam również Enum podczas pracy z Singleton, Sprawdzić Effective Java book CH2(CHAPTER 2 CREATING AND DESTROYING OBJECTS), cytuję:

„Choć takie podejście musi jeszcze być szeroko przyjęty, typ enum pojedynczym elementem jest najlepszym sposobem wdrożenia singleton . " nie wkleić kodu przeczytać książkę, jest doskonała.

Gdybym był tobą, najpierw przeczytałbym Thinking in java rozdział Wyliczone typy. Następnie po tym, jak efektywna Java rozdział 6 i powinieneś być dobry

2

Enum jest przydatny, gdy masz listę wartości, które są ważne i skończone.

Powiedz na przykład, że musisz użyć dnia tygodnia: inny dzień nie zostanie dodany i wolisz dzień.PONIEDZIAŁEK w kodzie, a nie numer i pamiętaj, że 0 to poniedziałek, 1 to wtorek i tak dalej. To sprawia, że ​​instrukcja switch łatwiej zrozumieć też z:

Switch(day) { 
    case Monday : ... break; 
    case Tuesday : ... break 
    etc. 
} 
3

Dodałbym do innych odpowiedzi, że teksty stałe są klasy, które mają tylko określoną liczbę instancji. Te wystąpienia mogą mieć pola i metody i mogą być używane jako dowolne inne obiekty Java. Na przykład, Month enum mógłby definiować metody jak

public int getNumberOfDays(int year); 
public boolean isFirstOfYear(); 
7

Najprostsza definicja - An enum is just like any other class, with a predefined set of instances.

Najlepsza część wyliczenia jest może on być stosowany w sprawozdaniach rozdzielczych, gdzie nie można używać łańcuchów.

i Enum jest bezpiecznym typem, więc nie można przypisać nowej wartości w środowisku wykonawczym.

+1

Dla każdego, kto się na to natknie, od wersji Java 7, nie jest już prawdą, że nie można używać 'String'ów w instrukcjach' switch'. http://docs.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html – Thor84no