Рубрики
Без рубрики

Все о типе данных enum в Java

Чтобы каждый знал все о типе данных enum в Java. С тегами java, enum, learning, details.

Цель этой статьи – предоставить доступ к типу данных 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”