Для чего полезен Enum?
После прочтения некоторых вопросов и ответов об enum я не считаю это полезным...
Это что-то между классом и переменной, но я знаю, где я могу его использовать, поэтому было бы более полезно, чем класс, или несколько переменных, например.
Ответы
Ответ 1
Есть и другие вещи, которые вы можете сделать, и причины их использования, но основная причина, по которой я использую перечисления, - предотвратить возможность недопустимого параметра. Например, представьте следующий метод:
public void doSomethingWithAMonth(int monthNum);
Это не только двусмысленно (индексы месяца начинаются с 1 или 0?), но вы можете дать недопустимые недопустимые данные (13+, отрицательные числа). Если у вас есть перечисление Month
с JAN, FEB и т.д., Подпись становится:
public void doSomethignWithAMonth(Month month);
Код, вызывающий этот метод, будет более читабельным и не может предоставлять неверные данные.
Ответ 2
Я использую Enums для всего, что имеет несколько неизменных "типов" чего-то. т.е. дни недели.
Почему я не использую String в этом случае, потому что я не могу выполнить оператор switch в String, и я могу на Enum, поэтому для каждого дня недели я могу сделать что-то конкретное.
Я также использую Enum при работе с шаблоном singleton, проверьте Эффективная Java-книга CH2 (ГЛАВА 2 СОЗДАНИЕ И УНИЧТОЖЕНИЕ ОБЪЕКТОВ), цитата:
"Хотя этот подход еще не получил широкого распространения
принятый, одноэлементный тип перечисления - лучший способ реализовать синглтон ". Не собираюсь вставлять код, читать книгу, это отлично.
Если бы я был вами, я бы сначала прочитал Thinking in java chapter Enumerated Types. Затем после этого Эффективная глава Java 6 и вы должны быть хорошими
Ответ 3
Простейшее определение - An enum is just like any other class, with a predefined set of instances.
Лучшая часть перечисления - это ее можно использовать в операторах switch, где мы не можем использовать строки.
и Enum - безопасный тип, поэтому вы не можете назначить новое значение во время выполнения.
Ответ 4
An enum
заставляет кодировщики выбирать из предопределенного списка сущностей или понятий. Хотя вы можете достичь той же цели с классами или установить переменную на определенное известное значение, перечисление менее подвержено ошибкам, поскольку оно рекламирует и применяет меню, из которого может выбрать установщик значения.
Ответ 5
Enum полезен, чтобы люди не делали то, что им не нужно делать. Например, если у меня есть:
public final static int WEATHER_SUNNY = 0;
public final static int WEATHER_RAINY = 1;
public final static int WEATHER_HAIL = 2;
то я могу сделать: MyClass.WEATHER_SUNNY + MyClass.WEATHER_HAIL
, что не имеет смысла. Для этого лучше иметь перемычку Weather. Это делает код более читаемым и запрещает суммирование двух целых чисел погоды.
Ответ 6
Я бы добавил к другим ответам, что перечисления - это классы, которые имеют только фиксированное количество экземпляров. Эти экземпляры могут иметь поля и методы и использоваться как любые другие объекты Java. Например, перечисление Month
может определять такие методы, как
public int getNumberOfDays(int year);
public boolean isFirstOfYear();
Ответ 7
Как следует из названия "enum", он идеально подходит для констант перечисления, которые обеспечивают расширенную функциональность. Например, вы можете сохранить некоторые константы, состоящие из нескольких параметров, таких как constantId, constanNameString, дополнительные параметры. Кроме того, перечисление может содержать функции.
Экзотическое использование перечисления - сделать одноэлемент.
Ответ 8
Enum полезен, когда у вас есть список значений, которые являются функционально значимыми и конечными.
Скажите, например, что вам нужно использовать день недели: другой день не будет добавлен, и вы предпочтете использовать Day.MONDAY в своем коде, а не цифре, и помнить, что 0 - понедельник, 1 вторник и т.д.
Это облегчает понимание оператора switch с помощью:
Switch(day) {
case Monday : ... break;
case Tuesday : ... break
etc.
}
Ответ 9
Кроме всего прочего, Enum полезен для создания синглетонов:
Что такое эффективный способ реализации одноэлементного шаблона в Java?