Dénomination des énumérations en Java: singulier ou pluriel?

184

Existe-t-il une recommandation "officielle" sur la façon de nommer les énumérations Java?

enum Protocol { HTTP, HTTPS, FTP }

ou

enum Protocols { HTTP, HTTPS, FTP }

Je sais que dans le monde .Net, la recommandation est d'utiliser le singulier sauf pour les énumérations qui représentent des indicateurs de bits. Juste curieux de savoir s'il y a quelque chose de similaire en Java.

Une question connexe qui semble être spécifique à .Net: singulier ou pluriel pour les énumérations?

friederbluemle
la source
3
Vous pouvez trouver la réponse ici . Les énumérations sont des classes, cela signifie que vous devez les déclarer de la même manière.
bsiamionau

Réponses:

220

Les énumérations en Java (et probablement les énumérations en général) doivent être au singulier. L'idée est que vous ne sélectionnez pas plusieurs protocoles, mais plutôt un protocole parmi les choix possibles dans la liste de valeurs.

Notez l'absence de pluriel: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Score Avram
la source
2
Microsoft semble avoir à peu près la même opinion sur la programmation .NET: stackoverflow.com/a/1336012/279112
Panzercrisis
Comment TimeUnit utilise les pluriels? par exemple: DAYS, HOURS...
theyuv
5
Les valeurs sont au pluriel, l'énumération elle-même n'est pas :-)
Calvin
21

De la même manière que lorsque vous définissez un nom de table dans une base de données ou une classe en Java, vous utilisez le singulier pour les énumérations, c'est également la meilleure option. Voyez simplement comment vous allez l'utiliser.

Écrivons un exemple:

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

class Appointment {
private Day day;

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

Au singulier, vous voyez clairement l'attribut intention de la journée. «jour» c'est le jour de la semaine où ce rendez-vous aura lieu. Sinon, la signature de la méthode aurait été définieDay (Days day) et à coup sûr beaucoup de gens se demanderont si le rendez-vous pourrait avoir lieu dans plus d'un jour.

Si vous travaillez dans une entreprise qui a des quarts de travail de 48 heures, vous pouvez essayer de définir quelque chose comme:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

De cette façon, vous pouvez définir les jours où vous allez travailler. Mais cela aura toujours l'air bizarre et il y a une meilleure option et utiliser la forme singulière:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Maintenant, vous montrez vraiment la signification de l'énumération. Habituellement, dans n'importe quel domaine, vous trouverez que l'utilisation du singulier pour une énumération est la meilleure option car chaque constante de l'énumération n'est qu'un élément.

Vous mentionnez également .NET. Une énumération «flags» dans .NET signifie simplement que lorsque vous attendez cette énumération comme paramètre, vous obtenez réellement une liste d'éléments de cette énumération (stockée sous forme d'entier).

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

public void setMultiHue(MultiHue hues);

Vous pouvez faire la même chose en Java, mais l'énumération sera toujours singulière:

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

Un moyen plus facile et plus clair (bien que cela utilise plus de mémoire) pour faire cela avec Java est simplement d'utiliser une liste.

Josep Panadero
la source
2
En fait, une meilleure façon de le faire serait un EnumSet qui encapsule un BitSet et s'occupe de tout cela pour vous. :-)
corsiKa