Цель этой статьи – предоставить доступ к типу данных enum
в Java
. Я надеюсь, что, прочитав это, вы узнаете что-то новое или освежите свои знания о Java
перечисление
тип данных. Итак, давайте погрузимся в суть.
В чем причина этой статьи?
Ну, я использовал enum, не зная об этом существенных знаний. Недавно в интервью меня спросили, может ли перечисление иметь конструктор и переменные экземпляра
? Я не мог ответить. Фактический ответ – да. Итак, я решил узнать как можно больше о enum и поделиться с другими, чтобы избежать распространенных ошибок.
Что такое тип данных enum?
Как с помощью javadoc
–
Тип перечисления – это специальный тип данных, который позволяет переменной представлять собой набор предопределенных констант.
Другими словами, тип данных enum представляет собой набор констант, сгруппированных вместе.
Перечисление – это просто тип класса, поскольку мы создаем классы в Java, но с другим специальным ключевым словом enum
и, по сути, работаем как простой класс Java. Весь тип перечисления неявно расширяет Перечисление
из java.lang
пакета и может реализовать интерфейс
(ы), а также перечисление могут иметь конструкторы, переменные экземпляра и методы
. Каждая константа, определенная вами в перечислении, по умолчанию будет public static final
. Каждая константа перечисления имеет индексный номер, называемый порядковым
номером. Порядковый номер – это просто число, которое определяет позицию этой конкретной константы перечисления. Порядковый номер начинается с 0 в виде массива на большинстве языков.
Одним ИЗ ОЧЕНЬ опасных промахов было бы то, что если у перечисления может быть конструктор, то я могу создать экземпляр перечисления, используя ключевое слово new. НЕТ – вы НЕ МОЖЕТЕ создать экземпляр типа enum, но подождите, тогда зачем перечислению иметь конструктор? Я отвечу на этот вопрос позже в этой статье.
Давайте создадим очень простой тип перечисления. Давайте проведем измерение Size
в качестве примера перечисления. Когда компания производит одежду, они определяют свой собственный размер своей одежды (да, есть несколько стандартных размеров, но давайте не будем об этом думать).
public enum Size { SMALL, // 0 MEDIUM, // 1 LARGE, // 2 EXTRA_SMALL, // 3 EXTRA_EXTRA_SMALL, // 4 EXTRA_LARGE, // 5 EXTRA_EXTRA_LARGE // 6 }
Все размеры, определенные внутри Size
– это константы перечисления типа Size.
Как мы можем видеть, если у нас есть более одной константы, то они разделяются запятыми, а у последней нет точки с запятой, хотя помещение одной в конце ни на что не влияет но это обязательно, когда мы используем переменные конструктора и экземпляра.
Итак, как нам получить к ним доступ? Поскольку все константы являются неявно общедоступными статическими конечными
, мы можем использовать enum type – Size для доступа к ним.
Size small = Size.SMALL; Size extraSmall = Size.EXTRA_SMALL; System.out.println(small); System.out.println(extraSmall);
будет выводить –
SMALL EXTRA_SMALL
соответственно к консоли.
Подожди! Держись, Размер.EXTRA_SMALL
потребуется больше места в нашей одежде, больше чернил означает больше затрат. Итак, почему бы не символизировать
их, чтобы уменьшить все накладные расходы. Чтобы сделать это, мы немного изменим наш размер перечисления, и именно тогда мы собираемся использовать contractor и переменную(ы) экземпляра.
public enum Size { SMALL("S"), // 0 MEDIUM("M"), // 1 LARGE("L"), // 2 EXTRA_SMALL("XS"), // 3 EXTRA_EXTRA_SMALL("XXS"), // 4 EXTRA_LARGE("XL"), // 5 EXTRA_EXTRA_LARGE("XXL"); // 6 private final String value; Size(String value) { this.value = value; } public String getValue() { return value; } }
На что следует обратить внимание – переменная конечного экземпляра 'value'
, перегруженный конструктор с неявным модификатором частного доступа
. Общедоступные и защищенные НЕ разрешены, поскольку они позволили бы вам создать экземпляр
. И, наконец, метод getter
для получения значения константы enum.
Теперь, благодаря переменной экземпляра, конструктору и методу получения, мы можем снизить наши затраты и напечатать что-то вроде этого –
Size extraSmall = Size.EXTRA_SMALL; Size extraExtraLarge = Size.EXTRA_EXTRA_LARGE; System.out.println(extraSmall.getValue()); System.out.println(extraExtraLarge.getValue());
будет выводить –
XS XXL
соответственно к консоли.
Значение также может быть напрямую доступно/передано другим, таким как
System.out.println(Size.MEDIUM.getValue()); // M
Теперь, что, если ваша компания решит, что мы не только собираемся отображать буквы/символ
размера, для удобства клиентов мы будем отображать размер в дюймах
рядом с буквой/символом размера. Что ж, не беспокойтесь, нам не придется кардинально менять или создавать другое перечисление для size. Мы можем сделать это вот так –
public enum Size { SMALL("S", 6), // 0 MEDIUM("M", 8), // 1 LARGE("L", 10), // 2 EXTRA_SMALL("XS", 4), // 3 EXTRA_EXTRA_SMALL("XXS", 2), // 4 EXTRA_LARGE("XL", 12), // 5 EXTRA_EXTRA_LARGE("XXL", 14); // 6 private final String value; private final int inches; Size(String value, int inches) { this.value = value; this.inches = inches; } public String getValue() { return value; } public int getInches() { return inches; } }
Теперь экземпляр перечисления Size имеет 2 атрибута, называемых value и inches.
Как насчет порядкового номера и других типов методов?
Давайте начнем с порядкового номера. Как уже упоминалось, порядковый номер – это не что иное, как положение констант. Давайте упорядочим наши константы размера от наименьшего к наибольшему по дюймам.
... EXTRA_EXTRA_SMALL("XXS", 2), // 0 EXTRA_SMALL("XS", 4), // 1 SMALL("S", 6), // 2 MEDIUM("M", 8), // 3 LARGE("L", 10), // 4 EXTRA_LARGE("XL", 12), // 5 EXTRA_EXTRA_LARGE("XXL", 14); // 6 ...
Все остальное – то же самое. Чтобы получить порядковый номер/индексный номер перечисления постоянного размера –
System.out.println(Size.MEDIUM.ordinal());
Будет печатать 3
на консоль как MEDIUM
в 4
позиции. Порядковый номер()
– это метод, доступный для Экземпляр размера
.
Есть 2 важных метода, доступных для размера типа перечисления наряду с другими. Они называются valueOf(строка)
и значения()
.
values()
возвращает массив типа enum ex. Размер и поскольку он возвращает массив, мы можем проиндексировать его или выполнить итерацию в соответствии с нашими потребностями.
System.out.println(Size.values()[0]); // EXTRA_EXTRA_SMALL System.out.println(Size.values().length); // 7
И Size.valueOf("string")
примет строковый аргумент и вернет экземпляр этого перечисления типа ex. Размер
, который имеет то же имя, что и “строка”, если не найден по имени, то Исключение IllegalArgumentException
будет брошен.
В более редких случаях тип enum также может иметь абстрактные методы
.
public enum Size { EXTRA_EXTRA_SMALL("XXS", 2){ @Override public String formatMyWay() { return EXTRA_EXTRA_SMALL.getValue()+" - " + EXTRA_EXTRA_SMALL.getInches() + "\""; } }; public abstract String formatMyWay(); // everything else is the same as before }
Ну, это все о перечислении с моей стороны. Я надеюсь, что это было полезно, и если я что-то пропустил, пожалуйста, не стесняйтесь сотрудничать. Счастливого кодирования!
Рекомендации:
JavaDoc Учебное пособие по Oracle Java
Оригинал: “https://dev.to/hamidur01/everything-about-enum-data-type-in-java-47ep”