Зачем использовать Enums вместо констант?

У меня есть сценарий, в котором у меня есть типы игроков ARCHER, WARRIOR и колдун. Что я должен использовать в классе игроков? Переменная String для типа или Enum? Почему перечисление и почему Constant Strings. Пожалуйста, помогите с причинами.

Ответ 1

Предположим, вы используете константные строки (или значения int - то же самое для них):

// Constants for player types
public static final String ARCHER = "Archer";
public static final String WARRIOR = "Warrior";

// Constants for genders
public static final String MALE = "Male";
public static final String FEMALE = "Female";

то вы в конечном итоге не знаете тип ваших данных - приводят к потенциально неправильному коду:

String playerType = Constants.MALE;

Если вы используете перечисления, это будет выглядеть как:

// Compile-time error - incompatible types!
PlayerType playerType = Gender.MALE;

Аналогично, перечисления дают ограниченный набор значений:

String playerType = "Fred"; // Hang on, that not one we know about...

против

PlayerType playerType = "Fred"; // Nope, that doesn't work. Bang!

Кроме того, перечисления в Java могут иметь дополнительную информацию, связанную с ними, а также могут иметь поведение. Гораздо лучше все вокруг.

Ответ 2

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

Это поможет вам не ошибиться, чтобы что-то ввести в домен, а вводить данные, а также улучшает читаемость программы.

Кроме того, вы всегда можете использовать свои перечисления как строку, если хотите. Вот ссылка .

Ответ 3

Кроме того, не позволяя вам предоставить неправильное значение, есть еще одна особенность перечислений, которые могут показаться незначительными, но, на мой взгляд, очень важно. Современные IDE могут автоматически предлагать значения для перечислений, в то время как нет возможности надежно вывести возможные значения строковой константы (Intellij IDEA делает последнее, но только для классов JDK и популярных библиотек). Это особенно полезно при изучении нового API.

Ответ 4

Я бы посоветовал вам использовать перечисления только в том случае, если вам действительно нужны перечислимые константы или некоторые дополнительные функции, общие для всех элементов.

Это, конечно, зависит от типа приложения, которое вы пишете, и от каких версий и устройств вы хотите поддерживать.

Причина в том, что перечисления добавляют служебные данные, потому что они распределяют экземпляры своих элементов. Вы можете заметить, что на платформе Android есть минимальные перечисления, и почти все константы являются окончательными статическими ints (например, View.GONE и тому подобное)

Ответ 5

Лучше использовать Enum для безопасности типов. Неверные значения не могут быть введены. Но перечисление в android занимает так много памяти, вместо этого вы должны использовать intdef. См. Этот ответ для примера и объяснения: -

Пример IntDef/StringDef

Вы также можете проверить исходный код Android, где он по возможности заменяет enums на IntDef/StringDef. Ex. View.VISIBLE.