Enum в java

Сегодня мы попробуем разобрать такое понятие как enum в языке java. Проще говоря — перечисления. Ведь очень часто во время написания программ нам необходимо использовать глобальные константы или только допустимые значения некоторого типа данных. Для этих целей идеально подойдет enum.

Давайте разберем все по порядку и закрепим теорию примерами.

Enum (перечисления) — это по сути обычный класс. Он может иметь конструкторы, методы и переменные. Для того, чтобы класс стал перечислением нужно пометить его ключевым словом enum.

Код   
  1. public enum EnumExample {
  2.  
  3. }

Но, если бы все было так просто данный тип не отделяли бы от простого класса и не выносили бы перечисления как отдельный вид.

После объявления данного класса-перечисления можно начать добавлять переменные. Для наглядного примера я создам вполне реальную задачу, которая могла бы случиться на серьезных проектах. Допустим у нас есть сайт. Его посещают — пользователи. У пользователей разные роли на сайте. Кто-то может быть администратором, кто-то просто пользователем или модератором. Давайте реализуем простой доступ к функционалу в зависимости от роли.

Код   
  1. public class UsersRoleAndFunctional {
  2.  
  3.     public static void checkFunctional(String userRole) {
  4.         if (userRole.equals(UserRole.ADMIN.name())) {
  5.             System.out.println("welcome administrator");
  6.         }else if(userRole.equals(UserRole.USER.name())) {
  7.             System.out.println("welcome user");
  8.         }else if(userRole.equals(UserRole.MODERATOR.name())) {
  9.             System.out.println("welcome user");
  10.         }
  11.         else {
  12.             System.out.println("register please");
  13.         }
  14.     }
  15.  
  16.     public static void main(String[] args) {
  17.         checkFunctional("ADMIN");
  18.         checkFunctional("MODERATOR");
  19.     }
  20.  
  21. }
  22.  
  23. enum UserRole {
  24.     ADMIN, USER, MODERATOR
  25. }

Как видно из примера выше — мы успешно использовали перечисления для реализации ролей пользователя. Обратите внимание на сравнение строки с enum. Для того, чтобы сравнить фактическое значение перечисления нужно вызвать встроенный метод name() или toString(). Об этой особенности очень важно знать. Для закрепления вот Вам пример:

Код   
  1. public class UsersRoleAndFunctional {
  2.  
  3.     public static void checkFunctional(String userRole) {
  4.         if (userRole.equals(UserRole.ADMIN.name())) {
  5.             System.out.println("welcome administrator");
  6.         }else if(userRole.equals(UserRole.USER.name())) {
  7.             System.out.println("welcome user");
  8.         }else if(userRole.equals(UserRole.MODERATOR.name())) {
  9.             System.out.println("welcome user");
  10.         }
  11.         else {
  12.             System.out.println("register please");
  13.         }
  14.     }
  15.  
  16.     public static void main(String[] args) {
  17.         System.out.println(UserRole.USER);
  18.         System.out.println(UserRole.USER.name());
  19.         System.out.println(UserRole.USER.equals("USER"));
  20.         System.out.println(UserRole.USER.name().equals("USER"));
  21.         System.out.println(UserRole.USER.toString().equals("USER"));
  22.     }
  23.  
  24. }
  25.  
  26. enum UserRole {
  27.     ADMIN, USER, MODERATOR
  28. }

Результатом выполнения кода будет:

enum result example

Строка System.out.println(UserRole.USER); выведет в консоль USER, но во время сравнения строки USER со строкой UserRole.USER будет false. Об этой особенности забывают даже опытные программисты.

Как уже было сказано выше — перечисления могут иметь конструкторы и методы. Давайте на примере разберем их использование. Ведь, иногда возникают ситуации, когда в enum нужно хранить что-то больше, чем просто строку.

Код   
  1. public enum ErrorMessageUtil {
  2.  
  3.     AUTHENTICATION_EXCEPTION("Ошибка входа"),
  4.     INVALID_RESOURCE_EXCEPTION("Ошибка валидации"),
  5.     PASSWORD_IS_NULL("введите пароль"),
  6.     LOW_RIGHTS("Не достаточно прав");
  7.  
  8.     private final String name;
  9.  
  10.     private ErrorMessageUtil(String s) {//приватный конструктор
  11.         name = s;
  12.     }
  13.  
  14.     public String getValue() {//метод для получения значения
  15.         return name;
  16.     }
  17. }
  18. class Main{
  19.     public static void main(String[] args) {
  20.         System.out.println(ErrorMessageUtil.AUTHENTICATION_EXCEPTION);
  21.         System.out.println(ErrorMessageUtil.INVALID_RESOURCE_EXCEPTION.getValue());//такой способ вызова я могу использовать для демонстрации ошибки пользователям
  22.         System.out.println(ErrorMessageUtil.LOW_RIGHTS.name().equals("LOW_RIGHTS"));//такой способ вызова я могу использовать для сравнения
  23.     }
  24. }

Пример выше это часть реального перечисления, которое я создал когда писал приложение Онлайн тесты. Было очень удобно хранить ошибку в enum. Я могу использовать одну переменную в нескольких частях моего кода. И, когда мне было необходимо изменить значение ошибки — мне было достаточно отредактировать только значение перечисления.

Как по мне, такой enum использовать очень удобно и просто.

В перечислениях можно хранить не только строковые значения. Для этого достаточно изменить тип возвращаемого значения со строкового на любой подходящий. Ниже предоставлен пример с числами. Я просто заменил строку на целочисленный тип:

Код   
  1. public enum ErrorMessageUtil {
  2.  
  3.     AUTHENTICATION_EXCEPTION(1),
  4.     INVALID_RESOURCE_EXCEPTION(2),
  5.     PASSWORD_IS_NULL(3),
  6.     LOW_RIGHTS(4);
  7.  
  8.     private final int name;
  9.  
  10.     private ErrorMessageUtil(int s) {//приватный конструктор
  11.         name = s;
  12.     }
  13.  
  14.     public int getValue() {//метод для получения значения
  15.         return name;
  16.     }
  17. }
  18. class Main{
  19.     public static void main(String[] args) {
  20.         System.out.println(ErrorMessageUtil.AUTHENTICATION_EXCEPTION);
  21.         System.out.println(ErrorMessageUtil.INVALID_RESOURCE_EXCEPTION.getValue());//такой способ вызова я могу использовать для демонстрации ошибки пользователям
  22.         System.out.println(ErrorMessageUtil.LOW_RIGHTS.name().equals("LOW_RIGHTS"));//такой способ вызова я могу использовать для сравнения
  23.     }
  24. }

Результатом работы программы будет следующее:

перечисления в джава с примером

Для того, чтобы получить элемент перечисления по его строковому представлению можно использовать метод valueOf(строка).

Код   
  1. public enum ErrorMessageUtil {
  2.  
  3.     AUTHENTICATION_EXCEPTION(1),
  4.     INVALID_RESOURCE_EXCEPTION(2),
  5.     PASSWORD_IS_NULL(3),
  6.     LOW_RIGHTS(4);
  7.  
  8.     private final int name;
  9.  
  10.     private ErrorMessageUtil(int s) {//приватный конструктор
  11.         name = s;
  12.     }
  13.  
  14.     public int getValue() {//метод для получения значения
  15.         return name;
  16.     }
  17. }
  18. class Main{
  19.     public static void main(String[] args) {
  20.         System.out.println(ErrorMessageUtil.valueOf("LOW_RIGHTS"));
  21.         System.out.println(ErrorMessageUtil.valueOf("LOW_RIGHTS").getValue());
  22.     }
  23. }

После выполнения примера в консоли можно увидеть:

LOW_RIGHTS
4

У enum объекта есть специальный метод для получения все элементов перечисления.

Код   
  1. class Main{
  2.     public static void main(String[] args) {
  3.         ErrorMessageUtil.values();//вернет все элементы перечисления в виде массива
  4.         Arrays.asList(ErrorMessageUtil.values()).forEach(it->System.out.println(it));
  5.     }
  6. }

Теперь Вы знаете еще один тип классов в джаве. Enum в java очень полезный и мощный инструмент который может сыграть Вам полезную службу. Достаточно только немного практики и можно будет применять перечисления в своих программах.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *