我在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>,该类同时包含原始EnumSetEnumSetMyCommands的扩展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中生成的命令的数量)。

再说一次,这也是覆盖命令的简便方法,因此也许可以将这一缺点变成优点。

09-26 22:58
查看更多