【发布时间】:2014-05-14 03:57:39
【问题描述】:
我正在编写一个游戏 API,我希望有一个控件枚举。我想定义基本控件(JUMP、MOVE_LEFT),但最终开发人员应该能够添加其他控件(DANCE、SHOOT)。
那么我如何允许最终程序员添加到我的列表中而不必触及我原来的枚举文件?
【问题讨论】:
-
你不能,但仍然使用
enum。
我正在编写一个游戏 API,我希望有一个控件枚举。我想定义基本控件(JUMP、MOVE_LEFT),但最终开发人员应该能够添加其他控件(DANCE、SHOOT)。
那么我如何允许最终程序员添加到我的列表中而不必触及我原来的枚举文件?
【问题讨论】:
enum。
正如链接的答案指出的那样,您不能直接扩展枚举。
您的问题没有提供太多可处理的信息,但这是我解决问题的方法。希望它会有所帮助。
首先,我将定义一个抽象来封装为每个“控件”执行的实际逻辑。
interface Behaviour {
void invoke();
}
实现此接口的对象将覆盖invoke() 方法以提供实际的控制逻辑,例如向左或向右移动游戏对象。
您的 API可以有一个类似下面的方法,该方法执行适合调用该方法的控件的任何操作。
public void moveObjectAccordingTo(Behaviour behaviour) {
behaviour.invoke();
// Whatever else you want to do...
}
然后,包含您的默认控件的枚举可以实现此接口,如下所示:
public enum Controls implements Behaviour {
JUMP("Player jumped..."),
MOVE_LEFT("Player moved left..."),
MOVE_RIGHT("Player moved right...");
private final String message;
Controls(String message) {
this.message = message;
}
@Override
public void invoke() {
System.out.println(message);
}
}
这允许您像这样使用以前的方法:
public void moveObjectAccordingTo(Controls.JUMP);
现在,您希望开发人员能够在不影响枚举的情况下将自己的附加控件添加到系统中。您所要做的就是实现Behaviour 接口并覆盖invoke 方法。像这样:
public class DanceControl implements Behaviour {
@Override
public void invoke() {
System.out.println("Player is dancing...");
}
}
然后可以在不更改原始枚举或更改 API 的情况下使用新行为。
public void moveObjectAccordingTo(new DanceControl());
【讨论】:
您的方法不好,因为在 Java 中您无法扩展枚举。 Java 中的枚举类型是最终设计的。
有关枚举的更多信息,您可以在官方documentation 中找到。
因此,按照设计,枚举类型应该只有在枚举中声明的元素。
你应该考虑在你的方法中使用接口而不是这个。
【讨论】: