Enum в java

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

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

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

Код   
public enum EnumExample {

}

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

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

Код   
public class UsersRoleAndFunctional {

    public static void checkFunctional(String userRole) {
        if (userRole.equals(UserRole.ADMIN.name())) {
            System.out.println("welcome administrator");
        }else if(userRole.equals(UserRole.USER.name())) {
            System.out.println("welcome user");
        }else if(userRole.equals(UserRole.MODERATOR.name())) {
            System.out.println("welcome user");
        }
        else {
            System.out.println("register please");
        }
    }

    public static void main(String[] args) {
        checkFunctional("ADMIN");
        checkFunctional("MODERATOR");
    }

}

enum UserRole {
    ADMIN, USER, MODERATOR
}

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

Код   
public class UsersRoleAndFunctional {

    public static void checkFunctional(String userRole) {
        if (userRole.equals(UserRole.ADMIN.name())) {
            System.out.println("welcome administrator");
        }else if(userRole.equals(UserRole.USER.name())) {
            System.out.println("welcome user");
        }else if(userRole.equals(UserRole.MODERATOR.name())) {
            System.out.println("welcome user");
        }
        else {
            System.out.println("register please");
        }
    }

    public static void main(String[] args) {
        System.out.println(UserRole.USER);
        System.out.println(UserRole.USER.name());
        System.out.println(UserRole.USER.equals("USER"));
        System.out.println(UserRole.USER.name().equals("USER"));
        System.out.println(UserRole.USER.toString().equals("USER"));
    }

}

enum UserRole {
    ADMIN, USER, MODERATOR
}

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

enum result example

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

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

Код   
public enum ErrorMessageUtil {

    AUTHENTICATION_EXCEPTION("Ошибка входа"),
    INVALID_RESOURCE_EXCEPTION("Ошибка валидации"),
    PASSWORD_IS_NULL("введите пароль"),
    LOW_RIGHTS("Не достаточно прав");

    private final String name;

    private ErrorMessageUtil(String s) {//приватный конструктор
        name = s;
    }

    public String getValue() {//метод для получения значения
        return name;
    }
}
class Main{
    public static void main(String[] args) {
        System.out.println(ErrorMessageUtil.AUTHENTICATION_EXCEPTION);
        System.out.println(ErrorMessageUtil.INVALID_RESOURCE_EXCEPTION.getValue());//такой способ вызова я могу использовать для демонстрации ошибки пользователям
        System.out.println(ErrorMessageUtil.LOW_RIGHTS.name().equals("LOW_RIGHTS"));//такой способ вызова я могу использовать для сравнения
    }
}

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

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

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

Код   
public enum ErrorMessageUtil {

    AUTHENTICATION_EXCEPTION(1),
    INVALID_RESOURCE_EXCEPTION(2),
    PASSWORD_IS_NULL(3),
    LOW_RIGHTS(4);

    private final int name;

    private ErrorMessageUtil(int s) {//приватный конструктор
        name = s;
    }

    public int getValue() {//метод для получения значения
        return name;
    }
}
class Main{
    public static void main(String[] args) {
        System.out.println(ErrorMessageUtil.AUTHENTICATION_EXCEPTION);
        System.out.println(ErrorMessageUtil.INVALID_RESOURCE_EXCEPTION.getValue());//такой способ вызова я могу использовать для демонстрации ошибки пользователям
        System.out.println(ErrorMessageUtil.LOW_RIGHTS.name().equals("LOW_RIGHTS"));//такой способ вызова я могу использовать для сравнения
    }
}

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

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

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

Код   
public enum ErrorMessageUtil {

    AUTHENTICATION_EXCEPTION(1),
    INVALID_RESOURCE_EXCEPTION(2),
    PASSWORD_IS_NULL(3),
    LOW_RIGHTS(4);

    private final int name;

    private ErrorMessageUtil(int s) {//приватный конструктор
        name = s;
    }

    public int getValue() {//метод для получения значения
        return name;
    }
}
class Main{
    public static void main(String[] args) {
        System.out.println(ErrorMessageUtil.valueOf("LOW_RIGHTS"));
        System.out.println(ErrorMessageUtil.valueOf("LOW_RIGHTS").getValue());
    }
}

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

LOW_RIGHTS
4

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

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

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: