Наименование перечислений в Java: единственное или множественное число?

184

Есть ли «официальная» рекомендация о том, как назвать перечисления Java?

enum Protocol { HTTP, HTTPS, FTP }

или

enum Protocols { HTTP, HTTPS, FTP }

Я знаю, что в мире .Net рекомендуется использовать единственное число, за исключением перечислений, которые представляют битовые флаги. Просто любопытно, есть ли что-то подобное в Java.

Смежный вопрос, который кажется специфичным для .Net: единственное или множественное число для перечислений?

friederbluemle
источник
3
Вы можете найти ответ здесь . Перечисления являются классами, это означает, что вы должны объявлять их одинаково.
bsiamionau

Ответы:

220

Перечисления в Java (и, возможно, перечисления в целом) должны быть единичными. Смысл в том, что вы выбираете не несколько протоколов, а один протокол из возможных вариантов в списке значений.

Обратите внимание на отсутствие множественного числа: http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Аврам Оценка
источник
2
Microsoft, похоже, придерживается примерно того же мнения в отношении программирования на .NET: stackoverflow.com/a/1336012/279112
Panzercrisis
Почему TimeUnit использует множественное число? например: DAYS, HOURS...
theyuv
5
Значения множественного числа, само перечисление не является :-)
Calvin
21

Точно так же, когда вы определяете имя таблицы в базе данных или класс в Java, вы используете единственное число для перечислений, это также лучший вариант. Просто посмотрите, как вы собираетесь его использовать.

Давайте напишем пример:

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

class Appointment {
private Day day;

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

В единственном числе вы ясно видите намерение атрибута дня. «день» - день недели, когда назначено это назначение. В противном случае подпись метода была бы setDay (дни дня), и наверняка многие люди будут интересоваться, может ли встреча произойти более чем за один день.

Если вы работаете в компании с 48-часовыми сменами, вы можете попытаться определить что-то вроде:

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Таким образом, вы можете установить дни, когда вы собираетесь работать. Но, тем не менее, это будет выглядеть странно, и есть лучший вариант - использовать единственную форму:

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

Теперь вы действительно показываете значение перечисления. Обычно в любой области вы обнаружите, что использование единственного числа для перечисления является наилучшим вариантом, поскольку каждая константа в перечислении - это всего лишь один элемент.

Вы также упоминаете .NET. Перечисление «flags» в .NET просто означает, что когда вы ожидаете, что enum в качестве параметра, то вы действительно получите список элементов этого перечисления (сохраненный как целое число).

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

public void setMultiHue(MultiHue hues);

Вы можете сделать то же самое в Java, но перечисление все равно будет единичным:

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

Проще и понятнее (хотя он использует больше памяти) сделать это с помощью Java - просто использовать List.

Хосеп Панадеро
источник
2
На самом деле, лучший способ сделать это - EnumSet, который инкапсулирует BitSet и позаботится обо всем за вас. :-)
corsiKa