Именование перечислений в Java: сингулярное или множественное?

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

enum Protocol { HTTP, HTTPS, FTP }

или

enum Protocols { HTTP, HTTPS, FTP }

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

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

Ответ 1

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

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

Ответ 2

Таким же образом, когда вы определяете имя таблицы в базе данных или классе в 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 (Days day), и наверняка многие люди будут задаваться вопросом, может ли встречаться встречаться более чем за один день.

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

public enum Days {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

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

public enum Shift {
MONDAY_TUESDAY, WEDNESDAY_THURSDAY, FRIDAY_SATURDAY
}

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

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

// 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, просто использовать список.