Предполагая, что вы хотите иметь только одну реализацию, вы можете опустить интерфейс и иметь Runnable
in Action
следующим образом:
public enum Action {
RUN("run", () -> System.out.println("run")),
WALK("walk", () -> System.out.println("walk")),
STOP("stop", () -> System.out.println("stop")),
JUMP("jump", Action::jump);
private final String value;
private final Runnable action;
Action(final String value, final Runnable action) {
this.value = value;
this.action = action;
}
public void execute() {
action.run();
}
private static void jump() {
// TODO: Implement me
}
Вы можете использовать лямбда-выражения или ссылки на методы для Runnable
. Вызывающий объект выполняет действие, например, Action.RUN.execute()
.
Таким образом, вам нужно обновлять этот класс только при добавлении действия.
Этот пример является аналогом пункта 42 в «Эффективном» Джошуа Блоха Java, третье издание.