Benennung von Enums in Java: Singular oder Plural?

184

Gibt es eine "offizielle" Empfehlung, wie man Java-Enums benennt?

enum Protocol { HTTP, HTTPS, FTP }

oder

enum Protocols { HTTP, HTTPS, FTP }

Ich weiß, dass in der .Net-Welt die Empfehlung lautet, Singular zu verwenden, mit Ausnahme von Aufzählungen, die Bit-Flags darstellen. Nur neugierig, ob es in Java etwas Ähnliches gibt.

Eine verwandte Frage, die .Net-spezifisch zu sein scheint: Singular oder Plural für Aufzählungen?

friederbluemle
quelle
3
Hier finden Sie eine Antwort . Aufzählungen sind Klassen, das heißt, Sie sollten sie auf die gleiche Weise deklarieren.
bsiamionau

Antworten:

220

Aufzählungen in Java (und wahrscheinlich Aufzählungen im Allgemeinen) sollten singulär sein. Der Gedanke ist, dass Sie nicht mehrere Protokolle auswählen, sondern ein Protokoll der möglichen Auswahlmöglichkeiten in der Werteliste.

Beachten Sie das Fehlen von Pluralformen: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Avram Score
quelle
2
Microsoft scheint über .NET - Programmierung in etwa die gleiche Meinung zu halten: stackoverflow.com/a/1336012/279112
Panzercrisis
Wie kommt es, dass TimeUnit Pluralformen verwendet? zB: DAYS, HOURS...
theyuv
4
Die Werte sind Plural, die Aufzählung selbst ist nicht :-)
Calvin
21

Genauso wie Sie beim Definieren eines Tabellennamens in einer Datenbank oder einer Klasse in Java Singular für Aufzählungen verwenden, ist dies auch die beste Option. Sehen Sie einfach, wie Sie es verwenden werden.

Schreiben wir ein Beispiel:

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

class Appointment {
private Day day;

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

In singulärer Form sehen Sie deutlich die Absicht des Tagesattributs. "Tag" ist der Wochentag, an dem dieser Termin stattfinden wird. Andernfalls wäre die Signatur der Methode setDay (Days day) gewesen, und sicher werden sich viele Leute fragen, ob der Termin in mehr als einem Tag stattfinden könnte.

Wenn Sie in einem Unternehmen mit 48-Stunden-Schichten arbeiten, können Sie versuchen, Folgendes zu definieren:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Auf diese Weise können Sie die Tage festlegen, an denen Sie zur Arbeit gehen. Trotzdem wird es seltsam aussehen und es gibt eine bessere Option und die Verwendung der Singularform:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Jetzt zeigen Sie wirklich die Bedeutung der Aufzählung. Normalerweise werden Sie in jeder Domäne feststellen, dass die Verwendung von Singular für eine Aufzählung die beste Option ist, da jede Konstante in der Aufzählung nur ein Element ist.

Sie erwähnen auch .NET. Eine "Flags" -Aufzählung in .NET bedeutet nur, dass Sie, wenn Sie diese Aufzählung als Parameter erwarten, tatsächlich eine Liste der Elemente dieser Aufzählung erhalten (als Ganzzahl gespeichert).

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

public void setMultiHue(MultiHue hues);

Sie könnten dasselbe in Java tun, aber die Aufzählung wird immer noch singulär sein:

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

Eine einfachere und klarere Möglichkeit (obwohl mehr Speicher benötigt wird), dies mit Java zu tun, ist die Verwendung einer Liste.

Josep Panadero
quelle
2
Ein besserer Weg, dies zu tun, wäre ein EnumSet, das ein BitSet kapselt und all das für Sie erledigt. :-)
corsiKa