Вызов методов enum извне - PullRequest
0 голосов
/ 20 мая 2011

код

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

любая помощь будет оценена

спасибо В

Ответы [ 3 ]

3 голосов
/ 20 мая 2011

Вы можете сделать как RoverCommand.L.parseCommand, потому что вам нужен экземпляр Command Interfrace для вызова метода. Но вы должны рассмотреть возможность создания 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;
    }
}
1 голос
/ 20 мая 2011

Я думаю, у вас есть много кода котельной плиты, который вам не нужен.Если вы делаете это таким образом, вы можете добавлять команды без необходимости добавления кода.

public interface Command {
}

public enum Commands {
    ;

    public static Command[] parseCommand(String command) {
        for (Class type : new Class[]{CameraCommand.class, RoverCommand.class})
            try {
                return new Command[]{(Command) Enum.valueOf(type, command)};
            } catch (IllegalArgumentException ignored) {
            }
        throw new IllegalArgumentException("Unknown Command " + command);
    }
}

public enum CameraCommand implements Command {
    CLICK
}

public enum RoverCommand implements Command {
    L, R, M;
}
1 голос
/ 20 мая 2011

Ваша проблема в том, что вы действуете на уровне класса, а не на уровне.Чтобы решить эту проблему, вы должны объявить ваш метод parseCommand как статический.

public static 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;
}
...