繁体   English   中英

具有动态方法名称的接口

[英]Interface to have dynamic method names

假设一个接口是这样暴露的:

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

现在像这样可以有任意数量的动作。 每个动作都与一个枚举类型相关联,如下所示:

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

现在每次我想添加更多动作时,我都需要在IAction接口中添加一个枚举和关联的方法。

相反,接口方法可以从枚举中公开吗? IAction 接口的任何实现都应该始终依赖于枚举Action Action中的所有枚举类型都应该公开。 这可能吗?

在您只想拥有一个实现的假设下,您可以省略接口并拥有一个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使用 lambda 或方法引用。 调用者通过例如Action.RUN.execute()执行一个动作。

这样,您只需在添加操作时更新此 class。

此示例类似于 Joshua Bloch 的有效 Java,第三版中的第 42 项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM