2013-04-02 14 views
122

Czy istnieje "oficjalne" zalecenie, jak nazwać wyliczenia Java?Nazywanie wyliczeń w Javie: pojedyncza lub mnoga?

enum Protocol { HTTP, HTTPS, FTP } 

lub

enum Protocols { HTTP, HTTPS, FTP } 

wiem w świecie .NET rekomendacja jest użycie liczby pojedynczej wyjątkiem teksty stałe, które reprezentują bitowe flagi. Ciekawe, czy jest coś podobnego w Javie.

Powiązane pytanie, które wydaje się być specyficzna .Net: Singular or plural for enumerations?

+0

Myślę, że jest to problem z wysoką względną odpowiedzią. –

+3

[Możesz znaleźć odpowiedź tutaj] (http://stackoverflow.com/questions/3069743/coding-conventions-naming-enums). Wyliczenia to klasy, to znaczy, że powinieneś zadeklarować je w ten sam sposób. – bsiamionau

Odpowiedz

156

stałe teksty w języku Java (i prawdopodobnie w ogóle teksty stałe) powinny być w liczbie pojedynczej. Rozumiemy, że nie wybierasz wielu protokołów, ale raczej jeden protokół z możliwych wyborów na liście wartości.

Uwaga brak liczby mnogiej: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

+7

Tego się spodziewałem. Dziękuję za potwierdzenie. – friederbluemle

+0

Moja przyjemność. Wydaje się, że to pomogło wielu ludziom. –

+2

Microsoft wydaje się mieć mniej więcej taką samą opinię na temat programowania .NET: http: // stackoverflow.com/a/1336012/279112 – Panzercrisis

16

W ten sam sposób, że podczas definiowania nazwy tabeli w bazie danych lub klasa w Javie użyć liczby pojedynczej na teksty stałe To także najlepsza opcja. Zobacz, jak zamierzasz z niego korzystać.

Napiszmy przykład:

public enum Day { 
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY 
} 

class Appointment { 
private Day day; 

public void setDay(Day day) { 
    this.day = day; 
} 
} 

W postaci pojedynczej widać wyraźnie intencję atrybutu dzień. "dzień" to dzień tygodnia, w którym odbędzie się ta nominacja. W przeciwnym razie podpis metody byłby ustawiony na dzień (dni dni) i na pewno wielu ludzi będzie się zastanawiać, czy spotkanie może nastąpić w więcej niż jeden dzień.

Jeśli pracujesz w firmie jest 48 godziny przesuwa można spróbować zdefiniować coś takiego:

public enum Days { 
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY 
} 

ten sposób można ustawić dzień masz zamiar pracować. Ale nadal będzie to wyglądać dziwnie i jest lepszym rozwiązaniem i jest użycie formy pojedynczej:

public enum Shift { 
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY 
} 

Teraz naprawdę pokazują znaczenie wyliczenia. Zwykle w każdej domenie odkryjesz, że używanie liczby pojedynczej do wyliczenia jest najlepszą opcją, ponieważ każda stała w wyliczeniu jest tylko jednym elementem.

Wspomniałeś również o .NET. Wyrażenie "flags" w .NET oznacza po prostu, że jeśli spodziewasz się, że wyliczenie jako parametru rzeczywiście otrzymasz, to lista elementów tego wyliczenia (zapisana jako liczba całkowita).

// Define an Enum with FlagsAttribute. 
[FlagsAttribute] 
enum MultiHue : short 
{ 
    Black = 0, 
    Red = 1, 
    Green = 2, 
    Blue = 4 
}; 

public void setMultiHue(MultiHue hues); 

Można zrobić to samo w Javie, ale enum nadal będzie liczba pojedyncza:

public enum Hue { 
BLACK, RED, GREEN, BLUE; 
private final Integer hue; 

Hue() { 
    this.hue = 1 << this.ordinal(); 
} 

public Integer toFlag() { 
    return this.hue; 
} 
} 

public class MultiHue { 
private Integer hues = 0; 

public void addHue(Hue hue) { 
    this.hues |= hue.toFlag(); 
} 

public boolean hasHue(Hue hue) { 
    return (this.hues & hue.toFlag()) != 0; 
} 
} 

Łatwiejszy i bardziej przejrzyste (chociaż wykorzystuje więcej pamięci), aby zrobić to z Java jest po prostu użyj listy.

+1

Właściwie lepszym sposobem na zrobienie tego jest EnumSet, który hermetyzuje BitSet i dba o to wszystko dla ciebie. :-) – corsiKa