覆盖Java中的枚举

时间:2016-05-15 15:16:31

标签: java enums override

我在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();
    }
}
}

该类有一个解析文本的方法,我在其中迭代 enum 值并将输入与每个命令的 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";}
        }
}

2 个答案:

答案 0 :(得分:1)

如果您想扩展课程,最好再创建一个MyExtendedCommands,例如Set<Command>。然后,您可以在该类中创建EnumSet,其中包含EnumSetMyCommands的原始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

显然,这并不能保护您在编译时不会出现重复。但是在运行时应该很容易防止欺骗(例如,通过测试abc: 123 中生成的命令的数量。

然后,这也是一种简单的覆盖命令的方法,所以也许这个缺点可以转化为优势。

答案 1 :(得分:0)

这应该有效。添加flag.IntVar关键字和public

@Override

此外,你几乎没有错误,如:

  • interface Command{ void execute(); String getId(); } enum MyCommands implements Command{ aCmd{ @Override public void execute() { /*do something*/ } @Override public String getId() { return "aCmd"; } } } ,其中小String位于开始
  • s
  • 中遗失;