Понимание перечислений в Java

Что такое перечисление java? Как они работают? Где я мог их использовать и как?
Могу ли я обойтись без использования перечислений в приложении или они настолько мощны, что лучше использовать их, чем игнорировать их?

Перечисления в Java 5+ – это в основном classы, которые имеют предопределенный набор экземпляров. Они предназначены для замены, скажем, набора целых констант. Они предпочтительно являются константами, так как они могут обеспечивать безопасность типов.

Поэтому вместо:

public class Suit { public final static int SPADES = 1; public final static int CLUBS = 2 public final static int HEARTS = 3; public final static int DIAMONDS = 4; } 

у тебя есть:

 public enum Suit { SPADES, CLUBS, HEARTS, DIAMONDS } 

Преимущества:

  1. Тип безопасности. Вы можете объявить аргумент функции, тип возвращаемого значения, член classа или локальную переменную, чтобы быть конкретным типом Enum, и компилятор обеспечит безопасность типа;
  2. Перечисления – это в основном classы. Они могут реализовывать интерфейсы, иметь поведение и т. Д.

Безопасность типа является проблемой, поскольку в первом примере это действительные утверждения:

 int i = Suit.DIAMONDS * Suit.CLUBS; 

или вы можете перейти в 11 к функции, ожидающей костюм. Вы не можете сделать это с помощью enums типов.

Вы можете использовать class для Suit для обеспечения безопасности типов, и это было решение перед Java 5. Джош Блох (в Effective Java , который должен читать для Java-программистов imho), способствовал типичному шаблону enum, который стал переходом на Java 5+. На нем есть достаточное количество шаблонов и некоторые угловые случаи, которые люди не склонны обслуживать, такие как сериализация, не вызывающая конструктор, и для того, чтобы вы получили только один экземпляр, вам пришлось переопределить метод readResolve ().

Например:

 public enum CardColour { RED, BLACK } public enum Suit { SPADES(CardColour.BLACK), CLUBS(CardColour.BLACK), HEARTS(CardColour.RED), DIAMONDS(CardColour.RED); private final CardColour colour; Suit(CardColour colour) { this.colour = colour; } public CardColour getColour() { return colour; } } 

Изменить: у Sun есть введение в типы перечислений .

Что касается интерфейсов, они действительно дополняют enums, а не являются альтернативой. Как вы могли бы сказать, что Suit – это интерфейс, и у вас будет следующее:

 public interface Suit { CardColour getColour(); } 

Проблема в том, что вы можете пойти и определить 300 различных костюмов, и вы также можете определить Spades несколько раз. Еще одно преимущество перечислений (несмотря на то, что они относятся к classу разгрузки), состоит в том, что имеется только один экземпляр каждого значения enums. Обычно это называется каноническим значением , означающим это равенство:

 a.equals(b) == b.equals(a) == (a == b) 

для всех a, b, которые являются экземплярами определенного Enum. Это означает, что вместо написания:

 if (card.getSuit().equals(Suit.SPADES)) { ... } 

ты можешь написать:

 if (card.getSuit() == Suit.SPADES) { ... } 

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

Подумайте об Enum следующим образом

 public class MyEnum { // Object instantiated at declaration public static final MyEnum ONE = new MyEnum(); public static final MyEnum TWO = new MyEnum(); public static final MyEnum THREE = new MyEnum(); // Notice a private constructor // There is no way outside MyEnum class call it private MyEnum() { ... } } 

Таким образом, MyEnum в качестве enums будет

 public enum MyEnum { ONE, TWO, THREE; } 

Оба схожи

С уважением,

Документация Sun enum, вероятно, является лучшим объяснением. Конечно, вы можете обойтись без них, как программисты Java, конечно же, до тех пор, пока не была выпущена Java 1.5. Обычно вы делаете то же самое, используя константы в версиях Java до 1.5. Но enums – приятное удобство.

Если ситуация не возникает, вам это не нужно.

Они позволяют вам иметь четко определенный набор вещей, например, если вы хотите представить состояния материи, которые могли бы иметь:

 enum MatterState { Solid, Liquid, Gas; } 

Там, где они избили старый стиль использования объектов для представления множеств несколькими способами, некоторые из них:

  • Вы можете использовать их в операторах switch.
  • Меньше кода.
  • Встроенный в / из строки.

Чтобы добавить дополнительную информацию, чтобы узнать ее больше, лучше начать с концепции переменной и ее значений. Теперь, как я уверен, каждая переменная имеет объявленный тип (например, примитивные типы Java). Каждый тип имеет свои собственные значения. Например, переменные с типом char могут принимать все индивидуальные символы в качестве своих значений. Поэтому очень полезно, когда вы хотите объявить переменную, может принимать все набор символьных констант. Например, все символьные константы приемлемы и значимы для переменной aCharToStopProgram:

 char aCharToStopProgram = getUserInput(); 

Однако, как насчет того, когда у вас ограниченное значение, я имею в виду, что область значений вашей переменной ограничена специальными значениями. Например, у вас есть userChoice, который сохраняет значение системного вопроса с множественным выбором. Таким образом, просто «a», «b», «c», «d» имеет смысл. Вы не хотите в другом разделе вашего программного кода (или по любой другой причине) этой переменной присваиваются бессмысленные значения, такие как ‘s’. Теперь верно ли использовать примитивный тип char для нашей переменной, который может принимать любую константу символа, такую ​​как следующее.

 char userChoice = getUserChoice(); 

В таких ситуациях Java предоставляет перечисляемые типы. Это означает, что с помощью ключевого слова enum вы можете определить новый class с ограниченными и фиксированными экземплярами, которые являются именованными именами (вы не можете создавать новые объекты). Например:

 enum MultipleChoiceAnswer { A, B, C, D }; 

или

 public enum MultipleChoiceAnswer { A('a'), B('b'), C('c'), D('d'); private char choice; private MultipleChoiceAnswer(char choice) { this.choice = choice; } public String getChoice() { return choice; } } 

В результате вы можете определить переменную с вашим собственным типом:

 MultipleChoiceAnswer userChoice = getUserChoice();//OR MultipleChoiceAnswer.A 

Из моей интерпретации enums более читабельны, чем что-либо еще. Они в основном используются для замены значений типа 1-6 с более описательными именами, такими как [Happy, Sad, Angry и т. Д.]. Вы должны использовать их, когда вам нужно использовать небольшой набор переменных для описания ожидаемого вами решения.

  • Поиск Tomcat vs Weblogic JNDI
  • Разница в производительности между Java 8 lambdas и анонимными внутренними classами
  • Защищенный модификатор доступа в Java
  • JSON-потребитель полиморфных объектов
  • Как разбирать дату?
  • Сериализация перечислений с помощью Jackson
  • Обмен данными сеанса между контекстами в Tomcat
  • Как заставить сканер отбрасывать исключения при вводе неправильного типа?
  • Обработка исключений Java
  • Как довольно печатать XML с Java?
  • Как эффективно удалять дубликаты из массива без использования Set
  • Давайте будем гением компьютера.