Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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_Design Patterns_Data Structures_Io_Console - Fatal编程技术网

Java 从控制台验证用户输入。命令是否有效等

Java 从控制台验证用户输入。命令是否有效等,java,design-patterns,data-structures,io,console,Java,Design Patterns,Data Structures,Io,Console,当程序从控制台获取命令时,验证命令是否有效并执行命令的标准/最佳做法是什么? 我在想类似于HashMap的东西,但是这不会降低所有字符串比较的性能吗 有一个很好的命令行参数处理库。是的。首先,不要担心性能。时间会晚一些到来(或者更可能根本不会到来)。解析命令不会比执行命令花费更多的时间,是吗 至于处理命令:首先,您应该将输入拆分为原子标记。这些可能是命令本身、开关-a-b-c或参数值,有时可能介于“”之间 将输入拆分为令牌后,验证该命令是否存在。如果是,请检查令牌供应是否对该命令有效 我不知道你

当程序从控制台获取命令时,验证命令是否有效并执行命令的标准/最佳做法是什么?

我在想类似于
HashMap的东西,但是这不会降低所有字符串比较的性能吗

有一个很好的命令行参数处理库。是的。

首先,不要担心性能。时间会晚一些到来(或者更可能根本不会到来)。解析命令不会比执行命令花费更多的时间,是吗

至于处理命令:首先,您应该将输入拆分为原子标记。这些可能是命令本身、开关-a-b-c或参数值,有时可能介于“”之间

将输入拆分为令牌后,验证该命令是否存在。如果是,请检查令牌供应是否对该命令有效

我不知道你想用什么样的架构。有时人们使用一个类来执行一个命令,有时有一个类和许多方法,有时有一个方法的案例非常长。哪个对你最好?可能不是最后一个,但无论您选择什么,都应该与命令及其作业的复杂性相匹配

例1:

abstract class Command {
  public abstract String getName();
  public abstract int execute(String[] parameters); // not implemented in Cmd* below
}

class Cmd1 extends Command {
  public String getName()
  {
    return "Cmd1";
  }
}

class Cmd2 extends Command {
  public String getName()
  {
    return "Cmd2";
  }
}

//somewhere else:
public void execute(String[] params) {
  Command[] commands = {new Cmd1(), new Cmd2()};
  for (Command cmd: commands) {
    if (cmd.getName().equals(params[0]) {
      cmd.execute(params);
      return;
    }
  }
  throw new RuntimeException("unknown command "+params[0]);
}
例2:

void processCmd1(String[] params);

void processCmd2(String[] params);


public static final String CMD1 = "cmd1";
public static final String CMD2 = "cmd2";
static HashSet<String> availableCommands = new HashSet<String>();
static {
  availableCommands.put(CMD1);
  availableCommands.put(CMD2);
}


{
  if (availableCommands.contains(params[0])) {
    switch(params[0]) { // java 7
      case CMD1:
        processCmd1(params[0]);
        break;
      case CMD2:
        processCmd2(params[0]);
        break;
    }
  } else {
    throw new RuntimeException("unknown command "+params[0]);
  }
}
void processCmd1(字符串[]参数);
void processCmd2(字符串[]参数);
公共静态最终字符串CMD1=“CMD1”;
公共静态最终字符串CMD2=“CMD2”;
静态HashSet availableCommands=newhashset();
静止的{
可用命令放置(CMD1);
可用命令put(CMD2);
}
{
if(availableCommand.contains(参数[0])){
开关(参数[0]){//java 7
案例CMD1:
processCmd1(参数[0]);
打破
案例2:
processCmd2(参数[0]);
打破
}
}否则{
抛出新的RuntimeException(“未知命令”+参数[0]);
}
}
例3:

abstract class Command {
  public abstract String getName();
  public abstract int execute(String[] parameters); // not implemented in Cmd* below
}

class Cmd1 extends Command {
  public String getName()
  {
    return "Cmd1";
  }
}

class Cmd2 extends Command {
  public String getName()
  {
    return "Cmd2";
  }
}

static HashMap<String,Command> commandMap = new HashMap<String,Command>();
static {
  Command cmd = new Cmd1();
  commandMap.put(cmd.getName(), cmd);
  cmd = new Cmd2();
  commandMap.put(cmd.getName(), cmd);
}

//somewhere else:
public void execute(String[] params) {
  Command cmd = commandMap.get(params[0]);
  if (cmd == null) {
    throw new RuntimeException("unknown command "+params[0]);
  } else {
    cmd.execute(params);
  }
}
抽象类命令{
公共抽象字符串getName();
public abstract int execute(字符串[]参数);//未在下面的Cmd*中实现
}
类Cmd1扩展命令{
公共字符串getName()
{
返回“Cmd1”;
}
}
类Cmd2扩展命令{
公共字符串getName()
{
返回“Cmd2”;
}
}
静态HashMap commandMap=新HashMap();
静止的{
Command cmd=new Cmd1();
commandMap.put(cmd.getName(),cmd);
cmd=新的Cmd2();
commandMap.put(cmd.getName(),cmd);
}
//其他地方:
public void execute(字符串[]参数){
Command cmd=commandMap.get(参数[0]);
如果(cmd==null){
抛出新的RuntimeException(“未知命令”+参数[0]);
}否则{
cmd.execute(params);
}
}

这方面的标准设计模式是责任链或解释器,但解释器可能有点过火。责任链基本上是一种动态创建if/then/else决策树的方法,而不是像if/then/else语句那样硬编码

我将预处理输入,然后使用责任链解析输入


我非常确信,用于命令行parg处理的标准库使用了编译成运行代码的正式语法。至少在石器时代我上一次使用它时是这样做的(lex和yacc是流行的选择),但今天它可能有点特别化了。

你可能需要澄清你所说的“有效”是什么意思。是否将命令与您认为有效的命令列表进行比较?不,正确应用
HashMap
不会自动降低性能。通过
console
您是指命令行参数吗?@Andremoniy:是的,命令行arguments@GregHewgill:是有效的命令,但字符串比较有性能开销(这与实际的hashmap无关)在这一点上,你甚至不想考虑性能。特别是解析命令行选项,在应用程序启动时只需执行一次,而且对您的整体应用程序性能绝对没有影响。我对它的实现方式很感兴趣。知道现有的库是有用的,apache commons站点上有该库的源代码。我怎么强调都不过分:它本身并不重要!您必须考虑整个命令处理体系结构,然后决定如何在该体系结构中检查命令是否存在。如果不想这样做,只需使用
HashSet
contains()
。我不明白你的意思。你能提供两个不同的架构示例,它们使用不同的方法来验证命令是否存在吗?如果你喜欢+1的话,你可以保持简短。但在第一个示例中,你迭代了所有可能的命令,而在第二个示例中,你使用哈希集和切换到进程来确认存在信息技术第二种方法显然更好,但在这两种情况下,您的“瓶颈”都是字符串比较。即使在
HashSet
中,也必须进行比较。我想知道是否有一个“技巧/模式”可以避免it@Jim我刚才又加了一个例子。我还考虑了一个例子,使用类上的反射和静态getter作为name,但足够了……也许我的问题没有正确地提出。我的兴趣主要是字符串参数到命令的映射,因为这(字符串比较)将是一个瓶颈。而不是一般的架构。那么,为什么要用设计模式标记它呢?这是一个架构标签……无论发生什么,您都无法避免对字符串进行某种解码。你必须翻译它,翻译/是/解码。将字符串转换为某种跳点的最快方法通常是某种哈希。。。这就是HashMap解决方案中的基本情况。写你自己的通常不是一个好主意,除非你正在做某种超时间关键系统。。。如果这就是您正在做的,那么您可能不应该首先使用Java。我说“通常”。如果字符串列表是固定的,则