我在Java中有一个类,该类具有实现接口的枚举,例如
class MyClass{
interface Command{
void execute();
String getId();
}
enum MyCommands implements Command{
aCmd{
void execute(){/*do something*/}
String getId(){return "aCmd";}
}
}
void MyMethod(String s){
for(Command cmd: MyCommands){
if(s.equals(cmd.getId())) cmd.execute();
}
}
}
该类有一个解析文本的方法,在该方法中,我遍历枚举值并将输入与每个命令的getId()比较。
现在,我确实想使用不同的命令来扩展该类(也就是说,我想以覆盖MyCommands并定义新命令的方式来扩展它)。我怎样才能做到这一点?
(我愿意以其他简单的方式重构超类)
class childClass extends myClass{
//In myMethod this enum should be iterated instead of myCommands
enum childCommands implements Command{
otherCmd{
void execute(){/*do something*/}
String getId(){return "aCmd";}
}
}
最佳答案
如果您想扩展课程,最好创建一个附加的enum
例如MyExtendedCommands
。然后,您可以在该类中创建一个Set<Command>
,该类同时包含原始EnumSet
和EnumSet
和MyCommands
的扩展MyExtendedCommands
。
class MyClass {
interface Command {
void execute();
String getId();
}
enum MyCommands implements Command {
aCmd {
public void execute() {/* do something */
}
public String getId() {
return "aCmd";
}
}
}
public void myMethod(String s) {
for (Command cmd : EnumSet.allOf(MyCommands.class)) {
if (s.equals(cmd.getId()))
cmd.execute();
}
}
}
可以使用以下方法扩展:
class MyExtendedClass extends MyClass {
enum MyExtendedCommands implements Command {
bCmd {
public void execute() {/* do something */
}
public String getId() {
return name();
}
}
}
public void myMethod(String s){
Set<Command> allCommands = new HashSet<>();
allCommands.addAll(EnumSet.allOf(MyCommands.class));
allCommands.addAll(EnumSet.allOf(MyExtendedCommands.class));
for(Command cmd: allCommands){
if(s.equals(cmd.getId())) cmd.execute();
}
}
}
显然,这并不能防止您在编译时遭受重复。但是在运行时防止重复应该很容易(例如通过测试
allCommands
中生成的命令的数量)。再说一次,这也是覆盖命令的简便方法,因此也许可以将这一缺点变成优点。