Nazewnictwo wyliczeń w Javie: liczba pojedyncza czy mnoga?

184

Czy istnieje „oficjalna” rekomendacja, jak nazwać wyliczenia Java?

enum Protocol { HTTP, HTTPS, FTP }

lub

enum Protocols { HTTP, HTTPS, FTP }

Wiem, że w świecie .Net zaleca się używanie liczby pojedynczej, z wyjątkiem wyliczeń, które reprezentują flagi bitowe. Ciekawe, czy w Javie jest coś podobnego.

Powiązane pytanie, które wydaje się być specyficzne dla .Net: liczba pojedyncza czy mnoga dla wyliczeń?

friederbluemle
źródło
3
Tutaj znajdziesz odpowiedź . Wyliczenia są klasami, co oznacza, że ​​powinieneś je deklarować w ten sam sposób.
bsiamionau

Odpowiedzi:

220

Wyliczenia w Javie (i prawdopodobnie wyliczenia w ogóle) powinny być w liczbie pojedynczej. Myślenie polega na tym, że nie wybierasz wielu protokołów, ale jeden protokół możliwych wyborów z listy wartości.

Zwróć uwagę na brak liczby mnogiej: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Ocena Avrama
źródło
2
Microsoft wydaje się mieć mniej więcej taką samą opinię na temat programowania .NET: stackoverflow.com/a/1336012/279112
Panzercrisis
Dlaczego TimeUnit używa liczby mnogiej? np .: DAYS, HOURS...
oni
4
Wartości są w liczbie mnogiej, sam wyliczenie nie jest :-)
Calvin
21

W ten sam sposób, gdy definiujesz nazwę tabeli w bazie danych lub klasie w Javie, używasz liczby pojedynczej dla wyliczeń, jest to również 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 liczbie pojedynczej wyraźnie widać zamiar atrybutu dnia. „dzień” to dzień tygodnia, w którym odbędzie się spotkanie. W przeciwnym razie podpis metody zostałby ustawiony na Dzień (Dzień) i na pewno wiele osób będzie się zastanawiać, czy spotkanie może nastąpić za więcej niż jeden dzień.

Jeśli pracujesz w firmie, masz 48-godzinne zmiany, możesz spróbować zdefiniować coś takiego:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

W ten sposób możesz ustawić dni, w które będziesz pracować. Ale nadal będzie wyglądać dziwnie i istnieje lepsza opcja i jest użycie liczby pojedynczej:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Teraz naprawdę pokazujesz znaczenie wyliczenia. Zwykle w każdej domenie przekonasz się, że użycie liczby pojedynczej w wyliczeniu jest najlepszą opcją, ponieważ każda stała w wyliczeniu jest tylko jednym elementem.

Wspominasz także .NET. Wyliczenie „flagi” w .NET oznacza po prostu, że gdy oczekujesz tego wyliczenia jako parametru, tak naprawdę otrzymujesz listę elementów tego wyliczenia (przechowywaną 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żesz zrobić to samo w Javie, ale wyliczenie nadal będzie liczbą pojedynczą:

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

Łatwiejszym i bardziej zrozumiałym (choć zużywa więcej pamięci) zrobienie tego w Javie jest po prostu użycie Listy.

Josep Panadero
źródło
2
W rzeczywistości lepszym sposobem na to jest EnumSet, który zawiera BitSet i dba o to wszystko za Ciebie. :-)
corsiKa