代码是
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/