Интерфейс для имен методов Dynami c - PullRequest
0 голосов
/ 26 апреля 2020

Допустим, интерфейс выставлен так:

public interface IAction {
  void run();
  void walk();
  void stop();
  void jump();
}

Теперь вот так может быть любое количество действий. И каждое действие связано с типом перечисления, как показано ниже:

public enum Action {
  RUN("run"),
  WALK("walk"),
  STOP("stop"),
  JUMP("jump")
}

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

Вместо этого, можно ли каким-либо образом открыть методы интерфейса из enum? И любая реализация интерфейса IAction всегда должна зависеть от enum Action . И все эти типы перечислений в Action должны быть выставлены. Это возможно?

1 Ответ

0 голосов
/ 26 апреля 2020

Предполагая, что вы хотите иметь только одну реализацию, вы можете опустить интерфейс и иметь 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, третье издание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...