концепция
Полное название enum - перечисление, которое представляет собой новую функцию, представленную в JDK 1.5.
В Java тип, измененный ключевым словом enum является типом Enum. Форма заключается в следующем:
enum color {красный, зеленый, синий}Если перечисление не добавляет ни одного метода, значение перечисления по умолчанию по умолчанию по умолчанию в упорядоченное значение, начиная с 0. В качестве примера, получая тип перечисления цветов, его константы перечисления красные: 0, зеленый: 1 и синий: 2 в последовательности
Преимущества перечисления: константы могут быть организованы и управляются единым образом.
Типичные сценарии применения для перечисления: коды ошибок, государственные машины и т. Д.
Природа типов перечисления
Хотя enum выглядит как новый тип данных, на самом деле Enum является ограниченным классом и имеет свой собственный метод.
При создании перечисления компилятор будет генерировать связанный класс для вас, который унаследован от java.lang.Enum .
java.lang.Enum Class Declaration
Публичный абстрактный класс Enum <E расширяет enum <e >> реализует сопоставимые <e>, serializable {...}Методы перечисления
В Enum предоставляются некоторые основные методы:
values() : возвращает массив экземпляров Enum, а элементы в этом массиве строго поддерживаются в порядке, который они объявлены в Enum.
name() : возвращает имя экземпляра.
ordinal() : возвращает заказ при объявлении экземпляра, начиная с 0.
getDeclaringClass() : возвращает тип перечисления, к которому принадлежит экземпляр.
equals() : определяет, является ли это одним и тем же объектом.
Вы можете использовать == для сравнения экземпляров enum .
Кроме того, java.lang.Enum реализует Comparable и Serializable интерфейсы, поэтому также предоставляется метод сравнения ().
Пример: основные методы отображения enum
открытый класс enummethoddemo {enum color {red, green, blue;} enum size {big, midge, small;} public static void main (string args []) {system.out.println ("================= ========================================================================================= = System.out.println ("============== Печать все размер ================================================================================================================ Color.green; Color.green: " + green.equals (color.green)); System.out.println (" зеленый равенственный размер. }}Выход
============================================================== = getDeclaringClass (): класс org.zp.javase.enumeration.enumdemo $ colorgreen hashcode (): 460141958green compareto color.green: 0green equals color.
Особенности перечисления
Характеристики перечисления суммируются в одном предложении:
В дополнение к тому, чтобы быть неспособным наследовать, enum в основном можно рассматривать как обычный класс.
Но это предложение нужно понимать отдельно, давайте подробно объясним это.
Перечисление может добавить методы
В главе концепции значение enum по умолчанию по умолчанию на упорядоченное значение, начиная с 0. Тогда вопрос: как назначить значения отображаемому enum.
Java не позволяет использовать значения = для перечисления константов
Если вы подвергались воздействию C/C ++, вы обязательно подумаете о символе назначения = естественно. На языке C/C ++ перечисление может быть назначено для перечисления констант с помощью символа назначения = отображается; Однако, к сожалению, символ назначения = назначенный для констант Enum не допускается в синтаксисе Java.
Пример: объявление перечисления на языке C/C ++
typedef enum {one = 1, два, три = 3, десять = 10} число;Enum может добавлять обычные методы, статические методы, абстрактные методы и методы конструктора.
Хотя Java не может напрямую присваивать значения экземплярам, она имеет еще лучшее решение: добавить методы, чтобы перечислять, чтобы косвенно реализовать назначения дисплеев.
При создании enum вы можете добавить в него несколько методов и даже конструкторы в него.
Примечание. Кроме того, в Enum экземпляр должен быть определен первым, а поля или методы не могут быть определены до экземпляра. В противном случае компилятор сообщит об ошибке.
Пример: Полностью показать, как определить обычные методы, статические методы, абстрактные методы и методы конструкции при перечислениях
public enum errorcode {ok (0) {public String getDescription () {return "успешно"; }}, Error_a (100) {public String getDescription () {return "error a"; }}, Error_b (200) {public String getDescription () {return "error b"; }}; частный код int; // Конструктор: конструктор ENUM может быть объявлен только частным разрешением или не объявляет разрешение Private ErrorCode (int Number) {// Конструктор this.code = number; } public int getCode () {// обычный метод возврата кода; } // обычный метод публичный абстрактный строка getDescription (); // Аннотация Метод public static void main (string args []) {// Статический метод для (errorcode s: errorcode.values ()) {System.out.println ("Код:" + s.getCode () + ", Описание:" + s.getDescription ()); }}}Примечание. Приведенный выше пример не рекомендуется, просто чтобы показать, что перечисление поддерживает определение различных методов. Вот упрощенный пример
Пример: определение типа перечисления кода ошибки
Результаты выполнения этого примера и приведенный выше пример точно одинаковы.
public enum errorcodeen {ok (0, "успех"), error_a (100, "error a"), error_b (200, "error b"); Errorcodeen (int number, string description) {this.code = number; this.description = описание; } private int code; частная строка описание; public int getCode () {return Code; } public String getDescription () {return description; } public static void main (string args []) {// Статический метод для (errorCodeen S: errorCodeen.values ()) {System.out.println ("Code:" + s.getCode () + ", Описание:" + s.getDescription ()); }}}Перечисление может реализовать интерфейсы
enum может реализовать интерфейсы, такие как общие классы.
Он также реализует класс перечисления кода ошибки в предыдущем разделе. Реализуя интерфейс, он может ограничивать свои методы.
публичный интерфейс inumberenum {int getCode (); String getDescription ();} public enum errorCodeen2 реализует inumberenum {ok (0, "успех"), error_a (100, "error a"), error_b (200, "error b"); Errorcodeen2 (int number, string description) {this.code = number; this.description = описание; } private int code; частная строка описание; @Override public int getCode () {return Code; } @Override public String getDescription () {return description; }}Перечисление не может быть унаследовано
Enum не может унаследовать другой класс, и, конечно, он не может унаследовать другое перечисление.
Поскольку enum фактически унаследованы от класса java.lang.Enum , а Java не поддерживает множественное наследство, Enum не может наследовать другие классы, и, конечно, он не может унаследовать еще один enum .
Перечисленные сценарии применения
Организовать константы
До JDK1.5 определение констант в Java было public static final TYPE a ; в этой форме. При перечислениях вы можете организовать константы ассоциаций, чтобы сделать код более читабельным и безопасным, а также использовать методы, предоставляемые перечислениями.
Формат декларации перечисления
ПРИМЕЧАНИЕ. Если в перечислении нет метода, вы также можете добавить запятую, полуколон или ничего после последнего экземпляра.
Следующие три метода объявления эквивалентны:
enum color {красный, зеленый, синий} enum color {красный, зеленый, синий,} enum color {красный, зеленый, синий; }Переключить состояние штата
Мы часто используем операторы коммутатора для написания государственных машин. После JDK7 Switch поддерживает параметры типов int、char、String、enum . По сравнению с этими типами параметров, код переключения с использованием перечислений более читабелен.
enum signal {red, желтый, зеленый} public static String getTraffInStruct (сигнал сигнал) {String instruct = "Сбой сигнала света"; Switch (сигнал) {case red: instruct = "red Light Stop"; перерыв; Case Yellow: инструкт = «Пожалуйста, обратите внимание на желтый свет»; перерыв; Case Green: Инструкт = "Линия зеленого света"; перерыв; по умолчанию: перерыв; } return instruct;}Организовать перечисление
Перечисления аналогичных типов могут быть организованы через интерфейсы или классы.
Тем не менее, это обычно организовано интерфейсом.
Причина в том, что интерфейс Java автоматически добавит public static модификатора в тип перечисления при компиляции; Класс Java автоматически добавит static модификатор в тип enum при компиляции. Вы видели разницу? Это верно, то есть организовать enum в классе. Если вы не изменяете его на public , вы можете получить доступ только к нему в этом пакете.
Пример: организовать перечисления в интерфейсах
Public Interface Plant {Enum Овощ реализует inumberenum {картофель (0, «картофель»), помидор (0, «томат»); Овощ (int №, строка описание) {this.code = number; this.description = описание; } private int code; частная строка описание; @Override public int getCode () {return 0; } @Override public String getDescription () {return null; }} enum фруктовые реализует inumberenum {Apple (0, "Apple"), Orange (0, "Orange"), банан (0, "банан"); Fruit (int №, строка описание) {this.code = number; this.description = описание; } private int code; частная строка описание; @Override public int getCode () {return 0; } @Override public String getDescription () {return null; }}}Пример: организовать перечисления в классе
Этот пример имеет тот же эффект, что и предыдущий пример.
Public Class Plant2 {public enum Овощные реализует inumberenum {...} // Опустите код публичный перечисление фруктов, реализует inumberenum {...} // Опустить код}Перечисление стратегии
Перечисление стратегии показано на эффективной Java. Это перечисление классифицирует константы перечисления путем перечисления вложенных перечислений.
Хотя этот подход не такой краткий, как оператор Switch, он безопаснее и более гибкий.
Пример: пример перечисления политики в отношении EffectViejava
enum payrollday {понедельник (Paytype.weekday), во вторник (Paytype.weekday), среда (Paytype.weekday), четверг (Paytype.weekday), пятница (Paytype.weekday), суббота (Paytype.weekend), воскресенье (Paytype.weekende); Частный окончательный зарплата; PAYROLLDAY (PAYTYPE PAYTYPE) {this.paytype = paytype; } Double Pay (Double Hoursworked, Double Payrate) {return Paytype.pay (Hoursworked, PAYRATE); } // Политика enum private enum Paytype {Weekday {Double ToptimePay (двойные часы, двойная заработная плата) {return Tours <= touss_per_shift? 0: (часы - часы_пера_shift) * заработная плата / 2; }}, Выходные {Double TuptimePay (двойные часы, двойная заработная плата) {return часы * заработная плата / 2; }}; Приватный статический окончательный int task_per_shift = 8; Аннотация Double Overtimepay (Double HRS, Double PAYRATE); Double Pay (Double Hoursworked, двойная заработная плата) {Double BasePay = Hoursworked * PAYRATE; вернуть базевые зажигания + pureTimepay (Hoursworked, PAYRATE); }}}тест
System.out.println («Доходы для людей, которые зарабатывают 100 в почасовую заработную плату в пятницу в течение 8 часов:» + PayRollday.Friday.Pay (8,0, 100)); System.out.println («Доходы для людей, которые зарабатывают 100 в почасовую заработную плату в субботу на 8 часов:» + PayRollday.Saturday.Pay (8,0, 100));
Перечисление и enummap
Java предоставляет два класса инструмента, которые удобны для работы перечисления и Enumset и Enummap.
EnumSet -это высокопроизводительная Set типов перечисления. Требуется, чтобы константы перечисления, помещенные в него, должны были принадлежать тому же типу перечисления.
EnumMap - это реализация карты, адаптированная для типов перечисления. Хотя использование других реализаций Map (таких как HashMap) также может завершить экземпляры типа перечисления для отображения значений, использование EnummAP является более эффективным: он может получать только экземпляры того же типа перечисления, что и значения ключей, и поскольку число экземпляров типа перечисления является относительно фиксированным и ограниченным, EnumMap использует массив для сохранения значений, соответствующих типу enum. Это делает Enummap очень эффективным.
// Использование enumset System.out.println ("Enumset Display"); Enumset <errorcodeeen> errset = enumset.allof (errorcodeen.class); for (errorcodeen e: errset) {system.out.println (e.name () + ":" + e.ordinal ());} // Использование enummap system.out.println ("enummap display"); enummap <statemachine.signal, string> errmap = new Enummap (statemachine.signal.class); errmap.put (statemachine.signal.red, "красный свет"); errmap.put (statemachine.signal.yellow, "желтый"); errmap.put (statemachine.signal.green, "зеленый свет"); Errmap.EntrySet (). iterator (); System.out.println (entry.getKey (). Name () + ":" + entry.getValue ());}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.