摆脱枚举中的代码重复

use*_*967 1 java enums code-duplication

我有一个接口,我希望枚举实现它,但有些方法是相同的,它会导致代码重复.我会使用抽象类而不是接口,但java不允许枚举扩展任何东西.有没有解决的办法?我包含一些代码来帮助理解问题.

public interface CommandI {
  boolean isCommand(String command);
  void execute(Drawer drawer, Creature creature);
  String getDescription();
}



public enum Command2 implements CommandI {
  FORWARD{
    private String description = "qwersadd";
    private String[] aliases = {"fd", "forward"};
    @Override
    public boolean isCommand(String command) {
        for (String s: aliases){
        if (s.equals(command)){
          return true;
        }
      }
      return false;
    }
    @Override
    public void execute(Drawer drawer, Creature creature) {
      throw new UnsupportedOperationException("Not supported yet.");
    }
    @Override
    public String getDescription() {
      return description;
    }
  },
  PENUP{
    private String description = "vcvzxcvz";
    private String[] aliases = {"pu", "penup"};
    @Override
    public boolean isCommand(String command) {
        for (String s: aliases){
        if (s.equals(command)){
          return true;
        }
      }
      return false;
    }
    @Override
    public void execute(Drawer drawer, Creature creature) {
      throw new UnsupportedOperationException("Not supported yet.");
    }
    @Override
    public String getDescription() {
      return description;
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

如您所见,只有execute方法会有所不同.

sp0*_*00m 5

我不确定你是否真的了解如何使用枚举.这是你应该实现的方式Command2:

public enum Command2 implements CommandI {

    FORWARD("qwersadd", new String[] { "fd", "forward" }),
    PENUP("vcvzxcvz", new String[] { "pu", "penup" });

    private final String description;
    private final String[] aliases;

    private Command2(String description, String[] aliases) {
        this.description = description;
        this.aliases = aliases;
    }

    @Override
    public boolean isCommand(String command) {
        for (String s : aliases) {
            if (s.equals(command)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void execute(Drawer drawer, Creature creature) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String getDescription() {
        return description;
    }

}
Run Code Online (Sandbox Code Playgroud)

例如,您想要实现execute主体的FORWARD时间,简单地(覆盖)覆盖它,如下所示:

FORWARD("qwersadd", new String[] { "fd", "forward" }) {
    @Override
    public void execute(Drawer drawer, Creature creature) {
        // specific execute body for FORWARD
    }
}
Run Code Online (Sandbox Code Playgroud)