覆盖 Java 中的枚举

Overriding an enum in Java

我在 Java 中有一个 class,它有一个 enum 实现 界面

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

class 有一个解析文本的方法,我在其中迭代 enum 值并将输入与 getId() 进行比较 每个命令。

现在我确实想用不同的命令扩展 class(也就是说,我想以覆盖 MyCommands 并定义新命令的方式扩展它)。我怎样才能做到这一点? (我愿意以其他简单的方式重构超级 class)

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";}
        }
}

这应该有效。添加 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
  • return "aCmd"
  • 中缺少 ;

如果您想扩展您的 class,最好创建一个额外的 enum,例如MyExtendedCommands。然后你可以在 class 中创建一个 Set<Command>,它包含 EnumSetMyCommandsMyExtendedCommands 的扩展 EnumSet

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.

中结果命令的数量

话又说回来,这也是一种覆盖命令的简单方法,所以也许这个缺点可以变成一个优点。