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

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

Solutions Collecting From Web of "Зачем использовать Enums вместо констант?"

Предположим, вы используете константные строки (или значения 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's not one we know about... 

против

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

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

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

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

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

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

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

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

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

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

Пример IntDef / StringDef

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