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.