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

Внедрение простых государственных машин с Java Enums

Узнайте, как использовать Java Enums для создания простых государственных машин

Автор оригинала: baeldung.

1. Обзор

В этом учебнике мы посмотрим на государственные машины и как они могут быть реализованы в Java с помощью Enums.

Мы также объясним преимущества этой реализации по сравнению с использованием интерфейса и конкретного класса для каждого состояния.

2. Ява Энумс

Java Enum это особый тип класса, который определяет список констант. Это позволяет безопасной реализации и более читаемого кода .

Например, предположим, что у нас есть система программного обеспечения для управления персоналом, которая может утверждать запросы на отпуск, представленные сотрудниками. Эта просьба рассматривается руководителем группы, который переосматривает ее менеджеру Департамента. Руководитель Департамента является лицом, ответственным за утверждение запроса.

Простейший enum, который содержит состояния запроса на отпуск:

public enum LeaveRequestState {
    Submitted,
    Escalated,
    Approved
}

Мы можем сослаться на константы этого enum:

LeaveRequestState state = LeaveRequestState.Submitted;

Enums также может содержать методы. Мы можем написать абстрактный метод в enum, который заставит каждый экземпляр enum реализовать этот метод. Это очень важно для внедрения государственных машин, как мы увидим ниже.

Так как Java enums неявно расширить класс java.lang.Enum , они не могут расширить другой класс. Тем не менее, они могут реализовать интерфейс, как и любой другой класс.

Вот пример энума, содержащего абстрактный метод:

public enum LeaveRequestState {
    Submitted {
        @Override
        public String responsiblePerson() {
            return "Employee";
        }
    },
    Escalated {
        @Override
        public String responsiblePerson() {
            return "Team Leader";
        }
    },
    Approved {
        @Override
        public String responsiblePerson() {
            return "Department Manager";
        }
    };

    public abstract String responsiblePerson();
}

Обратите внимание на использование заоколонна в конце последней постоянной enum. Заоколонна требуется, когда у нас есть один или несколько методов после константы.

В этом случае мы расширили первый пример с помощью ответственныйПерсон () метод. Это говорит нам лицо, ответственное за выполнение каждого действия. Итак, если мы попытаемся проверить лицо, ответственное за Эскалация состояние, это даст нам “Лидер команды”:

LeaveRequestState state = LeaveRequestState.Escalated;
assertEquals("Team Leader", state.responsiblePerson());

Таким же образом, если мы проверим, кто несет ответственность за утверждение запроса, он даст нам “Менеджер департамента”:

LeaveRequestState state = LeaveRequestState.Approved;
assertEquals("Department Manager", state.responsiblePerson());

3. Государственные машины

Государственная машина, также называемая машиной конечного состояния или конечным автоматом, — это вычислительная модель, используемая для создания абстрактной машины. Эти машины могут быть только в одном состоянии в данный момент времени. Каждое состояние является статусом системы, которая изменяется в другое состояние. Эти изменения состояния называются переходами.

Это может усложняться в математике с диаграммами и нотациями, но все намного проще для нас, программистов.

Государственный шаблон является одним из известных двадцати трех шаблонов дизайна GoF. Эта модель заимствует концепцию из модели в математике. Это позволяет объекту инкапсулировать различные поведения для одного и того же объекта, в зависимости от его состояния. Мы можем запрограммировать переход между состояниями, а затем определить отдельные состояния.

Чтобы лучше объяснить концепцию, мы расширим пример запроса на отпуск для реализации государственной машины.

4. Enums как государственные машины

Мы сосредоточимся на реализации enum государственных машин на Java. Возможны и другие реализации, и мы сравним их в следующем разделе.

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

public enum LeaveRequestState {

    Submitted {
        @Override
        public LeaveRequestState nextState() {
            return Escalated;
        }

        @Override
        public String responsiblePerson() {
            return "Employee";
        }
    },
    Escalated {
        @Override
        public LeaveRequestState nextState() {
            return Approved;
        }

        @Override
        public String responsiblePerson() {
            return "Team Leader";
        }
    },
    Approved {
        @Override
        public LeaveRequestState nextState() {
            return this;
        }

        @Override
        public String responsiblePerson() {
            return "Department Manager";
        }
    };

    public abstract LeaveRequestState nextState(); 
    public abstract String responsiblePerson();
}

В этом примере переходы государственных машин реализуются с использованием абстрактных методов enum . Точнее, с помощью следующееГосударство () на каждой постоянной enum мы указать переход к следующему государству. При необходимости мы также можем внедрить предыдущееГосударство () метод.

Ниже приведен тест для проверки нашей реализации:

LeaveRequestState state = LeaveRequestState.Submitted;

state = state.nextState();
assertEquals(LeaveRequestState.Escalated, state);

state = state.nextState();
assertEquals(LeaveRequestState.Approved, state);

state = state.nextState();
assertEquals(LeaveRequestState.Approved, state);

Мы начинаем запрос на отпуск в Представленные начальное состояние. Затем мы проверяем переходы состояния с помощью следующееГосударство () метод, который мы реализовали выше.

Обратите внимание, что с Утвержденные является окончательным состоянием, никакой другой переход не может произойти .

5. Преимущества внедрения государственных машин с Java Enums

Внедрение государственных машин с интерфейсами и классами реализации может быть значительным количеством кода для разработки и поддержания.

Поскольку Java enum в своей простейшей форме является списком констант, мы можем использовать enum для определения наших состояний. А так как enum также может содержать поведение, мы можем использовать методы для обеспечения реализации перехода между состояниями.

Наличие всей логики в простом enum позволяет для чистого и простого решения.

6. Заключение

В этой статье мы рассмотрели государственные машины и как они могут быть реализованы в Java с помощью Enums. Мы привели пример и протестировали его.

В конце концов, мы также обсудили преимущества использования enums для реализации государственных машин. В качестве альтернативы интерфейсу и решению для реализации enums обеспечивают более чистую и простую для понимания реализацию государственных машин.

Как всегда, все фрагменты кода, упомянутые в этой статье, можно найти в нашем Репозиторий GitHub .