Nomeação de enums em Java: Singular ou Plural?

184

Existe uma recomendação "oficial" de como nomear enums de Java?

enum Protocol { HTTP, HTTPS, FTP }

ou

enum Protocols { HTTP, HTTPS, FTP }

Eu sei que no mundo .Net a recomendação é usar o singular, exceto as enumerações que representam sinalizadores de bits. Apenas curioso se há algo semelhante em Java.

Uma questão relacionada que parece ser específica da .Net: Singular ou plural para enumerações?

friederbluemle
fonte
3
Você pode encontrar resposta aqui . Enums são classes, significa que você deve declará-las da mesma maneira.
bsiamionau

Respostas:

220

Enums em Java (e provavelmente enums em geral) devem ser singulares. O pensamento é que você não está selecionando vários protocolos, mas um protocolo das escolhas possíveis na lista de valores.

Observe a ausência de plurais: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Pontuação Avram
fonte
2
A Microsoft parece ter aproximadamente a mesma opinião sobre a programação .NET: stackoverflow.com/a/1336012/279112
Panzercrisis
Como o TimeUnit usa plurais? por exemplo: DAYS, HOURS...
theyuv
4
Os valores são plurais, a própria enumeração não é :-)
Calvin
21

Da mesma forma que quando você define um nome de tabela em um banco de dados ou uma classe em Java, você usa singular para enumerações também é a melhor opção. Basta ver como você vai usá-lo.

Vamos escrever um exemplo:

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

class Appointment {
private Day day;

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

Na forma singular, você vê claramente o atributo intenção do dia. "dia" é o dia da semana em que este compromisso será realizado. Caso contrário, a assinatura do método teria sido definida como Dia (Dias do dia) e, com certeza, muita gente se perguntaria se o compromisso poderia ocorrer em mais de um dia.

Se você trabalha em uma empresa com turnos de 48 horas, tente definir algo como:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Dessa forma, você pode definir os dias em que vai trabalhar. Mas ainda vai parecer estranho e há uma opção melhor e é usar a forma singular:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Agora você realmente está mostrando o significado da enumeração. Normalmente, em qualquer domínio, você descobrirá que usar singular para uma enumeração é a melhor opção, pois cada constante na enumeração é apenas um elemento.

Você também mencionou o .NET. Uma enumeração "flags" no .NET significa apenas que, quando você espera essa enumeração como parâmetro, o que você realmente obtém é uma lista de elementos dessa enumeração (armazenados como um número inteiro).

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

public void setMultiHue(MultiHue hues);

Você poderia fazer o mesmo em Java, mas o enum ainda será 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;
}
}

Uma maneira mais fácil e clara (embora use mais memória) para fazer isso com Java é apenas usar uma lista.

Josep Panadero
fonte
2
Na verdade, uma maneira muito melhor de fazer isso seria um EnumSet que encapsule um BitSet e cuide de tudo isso para você. :-)
corsiKa