假设一个接口(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/