Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从外部调用枚举方法_Java_Interface_Enums_Abstraction - Fatal编程技术网

Java 从外部调用枚举方法

Java 从外部调用枚举方法,java,interface,enums,abstraction,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 ne

代码是

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;
}
}
任何帮助都将不胜感激

谢谢
V

您可以执行类似于
RoverCommand.L.parseCommand
的操作,因为您需要Command interfrace的实例来调用方法。 但是你应该考虑制作<代码> PARSCOMMAND 静态方法。例如,在RoverCommand中,将其设为静态并调用RoverCommand.parseCommand

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

String命令String=“L单击R L单击”;
List commands=CommandParser.parseCommands(commandsString);
公共类命令分析器{
公共静态命令parseSingleCommand(字符串命令){
如果(“单击”.equals(命令)){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{抛出新的IllegalArgumentException(“未知命令:“+command”);}
}
公共静态列表解析命令(字符串命令字符串){
String[]commands=commandsString.split(“”);
列表结果=新建ArrayList();
用于(字符串命令:命令){
add(CommandParser.parseSingleCommand(command));
}
返回结果;
}
}

您可以像
RoverCommand.L.parseCommand
一样执行,因为您需要Command interfrace的实例来调用方法。 但是你应该考虑制作<代码> PARSCOMMAND 静态方法。例如,在RoverCommand中,将其设为静态并调用RoverCommand.parseCommand

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

String命令String=“L单击R L单击”;
List commands=CommandParser.parseCommands(commandsString);
公共类命令分析器{
公共静态命令parseSingleCommand(字符串命令){
如果(“单击”.equals(命令)){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{抛出新的IllegalArgumentException(“未知命令:“+command”);}
}
公共静态列表解析命令(字符串命令字符串){
String[]commands=commandsString.split(“”);
列表结果=新建ArrayList();
用于(字符串命令:命令){
add(CommandParser.parseSingleCommand(command));
}
返回结果;
}
}

你的问题在于你是在班级层面而不是在Instance层面行事。要解决这个问题,您应该将您的方法parseCommand声明为static

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;
}
publicstaticcommand[]parseCommand(stringcommandstring){
RoverCommand[]命令=新的RoverCommand[commandString.length()];
对于(int i=0;i
你的问题在于你是在班级层面而不是在Instance层面行事。要解决这个问题,您应该将您的方法parseCommand声明为static

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;
}
publicstaticcommand[]parseCommand(stringcommandstring){
RoverCommand[]命令=新的RoverCommand[commandString.length()];
对于(int i=0;i
我想你有很多不需要的锅炉铭牌代码。如果您这样做,您可以添加命令,而无需添加代码

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

我想你有很多你不需要的车牌代码。如果您这样做,您可以添加命令,而无需添加代码

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

这是毫无疑问的。请确保当您询问有关Stackoverflow的问题时,您实际上在此处没有问题的地方添加了一个问号。请确保当你问一个关于Stackoverflow的问题时,你实际上在某处包括了一个问号