java - 从外部调用枚举方法

标签 java interface enums abstraction

代码是

public interface Command {
     public Command[] parseCommand(String command);
}

public enum CameraCommand implements Command {
    CLICK;  
    public Command[] parseCommand(String commands) {
    if ("CLICK".equals(commands))
        return new Command[] { CameraCommand.CLICK };
        return null;
    }
}

public enum RoverCommand implements Command {

    L,
    R,
    M;

public Command[] parseCommand(String commandString) {
    RoverCommand[] commands = new RoverCommand[commandString.length()];

    for (int i = 0; i < commandString.length(); i++) {
        switch (commandString.charAt(i)) {
        case 'L':
            commands[i] = RoverCommand.L;
            break;
        case 'R':
            commands[i] = RoverCommand.R;
            break;
        case 'M':
            commands[i] = RoverCommand.M;
            break;
        default:
            break;
        }
    }
    return commands;
}
}

我这样做是为了对命令类型进行分组。 现在的问题是,我得到了字符串中特定类型的命令,例如“CLICK”。我不知道类型,但我希望这样做

Machine machine = getMachine(type); //machine is an interface, i pass type and get a typeof machine
//machine.parseCommand(commandString); //i don wish to have this logic inside the machine
Command[] command = Command.parseCommand(commandString); // this didnt work, how to solve this, work around?
machine.execute(command); ///finally pass the command and execute the action

如有任何帮助,我们将不胜感激

谢谢 V

最佳答案

你可以像RoverCommand.L.parseCommand那样做,因为你需要一个Command接口(interface)的实例来调用方法。 但您应该考虑将 parseCommand 设为静态方法。例如,在 RoverCommand 中将其设为静态并调用 RoverCommand.parseCommand。

我认为您应该用空格等分隔 commandString 中的所有命令。然后使用一个静态方法解析由空格分隔的每个命令,该方法决定它是“CLICK”、“L”、“R”还是“M”。 例如

String commandsString = "L CLICK R L CLICK";
List<Command> commands = CommandParser.parseCommands(commandsString);

public class CommandParser {
    public static Command parseSingleCommand(String command) {
        if ("CLICK".equals(command)) { return CameraCommand.CLICK; }
        else if ("R".equals(command)) { return RoverCommand.R; }
        else if ("L".equals(command)) { return RoverCommand.L; }
        else if ("M".equals(command)) { return RoverCommand.M; }
        else { throw new IllegalArgumentException("Unknown command: " + command); }
    }

    public static List<Command> parseCommands(String commandsString) {
       String[] commands = commandsString.split(" ");
       List<Command> result = new ArrayList<Command>();
       for (String command : commands) {
          result.add(CommandParser.parseSingleCommand(command));
       }
       return result;
    }
}

关于java - 从外部调用枚举方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6070218/

相关文章:

java - 合并排序在更大的输入上运行得更快

java - "ScrollView can only host 1 child"在 2 个 fragment 中,只有 1 个 child ?

java - 如何在 Java 中对字符串的 ArrayList 进行排序?

java - 使用泛型类实现 Comparable

C 中的 enum 可以用 const 代替吗?

java - TOMCAT 继续运行相同的 war 文件故障

java - fragment 与 Activity 通信

pointers - 将结构指针转换为接口(interface){}

asp.net-mvc - EnumDropDownListFor 不选择值,尽管值已传递给 View

java - 如何在 Java 枚举中定义静态常量?