Nombramiento de enumeraciones en Java: ¿Singular o Plural?

184

¿Hay una recomendación "oficial" de cómo nombrar enumeraciones Java?

enum Protocol { HTTP, HTTPS, FTP }

o

enum Protocols { HTTP, HTTPS, FTP }

Sé que en el mundo .Net la recomendación es usar singular, excepto las enumeraciones que representan banderas de bits. Simplemente curioso si hay algo similar en Java.

Una pregunta relacionada que parece ser específica de .Net: ¿ Singular o plural para enumeraciones?

Friederbluemle
fuente
3
Puedes encontrar la respuesta aquí . Las enumeraciones son clases, es decir, debe declararlas de la misma manera.
bsiamionau

Respuestas:

220

Las enumeraciones en Java (y probablemente las enumeraciones en general) deben ser singulares. La idea es que no está seleccionando múltiples protocolos, sino un protocolo de las posibles opciones en la lista de valores.

Tenga en cuenta la ausencia de plurales: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Puntuación Avram
fuente
2
Microsoft parece tener aproximadamente la misma opinión sobre la programación .NET: stackoverflow.com/a/1336012/279112
Panzercrisis
¿Cómo es que TimeUnit usa plurales? por ejemplo: DAYS, HOURS...
theyuv
55
Los valores son plurales, la enumeración en sí no es :-)
Calvin
21

De la misma manera que cuando define un nombre de tabla en una base de datos o una clase en Java, utiliza singular para enumeraciones, también es la mejor opción. Solo mira cómo lo vas a usar.

Escribamos un ejemplo:

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

class Appointment {
private Day day;

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

En forma singular, ve claramente la intención del atributo del día. "día" es el día de la semana en que se realizará esta cita. De lo contrario, la firma del método se hubiera establecido Día (Día) y seguramente muchas personas se preguntarán si la cita podría ocurrir en más de un día.

Si trabaja en una empresa que tiene turnos de 48 horas, podría intentar definir algo como:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

De esa manera, podría establecer los días que va a trabajar. Pero aún así se verá raro y hay una mejor opción y es usar la forma singular:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Ahora realmente estás mostrando el significado de la enumeración. Por lo general, en cualquier dominio, encontrará que usar singular para una enumeración es la mejor opción, ya que cada constante en la enumeración es solo un elemento.

También mencionas .NET. Una enumeración "flags" en .NET solo significa que cuando espera esa enumeración como parámetro, lo que realmente obtiene es una lista de elementos de esa enumeración (almacenados como un entero).

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

public void setMultiHue(MultiHue hues);

Podrías hacer lo mismo en Java, pero la enumeración seguirá siendo singular:

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

Una manera más fácil y clara (aunque usa más memoria) de hacer esto con Java es simplemente usar una Lista.

Josep Panadero
fuente
2
En realidad, una forma mucho mejor de hacerlo sería un EnumSet que encapsula un BitSet y se encarga de todo eso por usted. :-)
corsiKa