java - 具有动态方法名称的接口(interface)

标签 java reflection enums interface

假设一个接口(interface)是这样公开的:

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

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

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

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

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

最佳答案

假设您只想有一个实现,您可以省略接口(interface)并在 Action 中使用 Runnable,如下所示:

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()

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

此示例是 Joshua Bloch 的《Effective Java》第三版中第 42 项的类比。

关于java - 具有动态方法名称的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61442142/

相关文章:

c# - 当你只知道通用基类的类型时,如何找到通用基类的派生类?

Java Reflection API - 获取 String[] 字段的值

objective-c - 将方法的所有参数传递到 NSLog

sql - 我可以比较 MySQL 枚举吗?

java - 我是否需要创建另一个 Activity 来显示一些信息? (安卓) (Java)

java - 使用 for 循环创建圣诞树

java - Web 服务中关于身份验证失败的用户通知方式哪种更好?

ios - swift : Enum constant with type and value

Java8枚举避免多个if else

java - 没有带有 @XmlElementDecl 的 ObjectFactory