2016-07-25 100 views
-3

你好我正在尝试创建一个Java程序,用户可以输入不同的命令,这个类可以识别所有命令,并基于它调用3-4个不同类的方法。目前每个命令我有if语句不同,因为这样的:在JAVA中if语句太多

if (input.equals("change category FOOD"){...} 
if (input.equals("Sort by price FOOD"){...} 
if (input.equals("logout"){...} 

有这么多的命令,我想知道是否有缩短这件事的方式。

+2

也许。你需要告诉我们一些'{...}'部分的内容。 –

+1

你可以使用'switch/case'语句。或者某种命令模式的命令在'HashMap'中。 –

+1

使用'Map '来定义命令和表示要做什么的对象('[something]'部分)之间的映射。既然你没有告诉我们这些命令是什么,我们就不能告诉你什么是“什么”。 –

回答

-1

那么,首先,你要检查每个if语句,每次你处理输入。如果使用if/else以保持代码更清洁和更高效

if (input.equals("Hi") { 
... 
} 
else if (input.equals("Hi") { 
... 
} 

等等。

您还要求输入与半长字符串完全匹配。这种情况几乎不会发生在实践中,你应该要么要求更短的参数,通过使用

String newString = string.split(" "); 

最后一件事的字符串分割成一个数组,只是尽量保持你的代码尽可能干净。您很可能无法缩短支票,因此请保持您的代码可读性,并且不要将大量代码放在一个地方。

+0

你为什么要这样......? –

0

使用一个字符串switch语句自动实现string.equals方法:

switch(input) { 
     case "change category FOOD": 
      statement; 
      break; 
     case "Sort by price FOOD": 
      statement; 
      break; 
     case "logout": 
      statement; 
      break; 
     default: 
      statement; 
    } 

在哪里“声明”表示{...}你把你的问题。

当你的if/else语句开始堆积时,这是一个不错的选择。不要忘记添加default:的情况。如果没有一个案例得到满足,它将作为最终的“其他”声明。

0

要扩大@Jim驻军的评论,

使用地图,其中第一类是字符串,表示该命令,第二类是可以运行的类。如果你不需要任何命令,那么使用Runnable,并为每个命令编写一个Runnable实现,并在一个设置函数中创建映射条目。

如果您需要更多信息,请创建n接口SomeInterface,它具有onCommand(...)方法,传递必要的数据。再次,为每个命令添加一个实现,并将每个命令的映射添加到映射的command-runner。因此,运行正确的命令实现将只是

map.get(“command”)。onCommand(...);

+0

我试过了,但是这意味着它会创建很多类,并且有很多命令,所以很多类也是如此 –

+0

所以,你必须以这样或那样的方式去查看每个命令。无论采用哪种方法,从根本上来说,在某些情况下,您将会检查一些可能的命令来检查每个字符串。你所能做的就是尽量让自己更易读。分离到类中是一个相当可读的手段,但它的确是你的编码风格的决定因素。 – TheNumenorean

+0

哦好吧非常感谢你! –

0

创建Map<String,Function>

设置字符串键的命令和Function适当。

然后,您可以通过从地图调用该函数来执行该函数。

+0

我会试一试 –

0

其他答案建议使用map这肯定是可行的。它有几个潜在的缺点但是:

  • 你永远局限于equals以匹配操作的命令
  • ,您将需要一个单独的地图
  • 可能难以测试 - 例如嘲笑命令意味着暴露单例

封装一组命令的可能替代方法是使用带有可运行变量的enum。例如:

public enum Command { 
    CHANGE_CATEGORY("change category",() -> { 
     // change category 
    }), 
    SORT_BY_PRICE("sort by price",() -> { 
     // sort by price 
    }), 
    ... 
    DEFAULT("",() -> { 
     // default action 
    }); 

    private final String commandText; 
    private final Runnable action; 

    Command(String commandText, Runnable action) { 
     this.commandText = commandText; 
     this.action = action; 
    } 

    public static void run(String text) { 
     Arrays.stream(values()) 
      .filter(c -> c.commandText.equals(text)) 
      .findAny().orElse(DEFAULT) 
      .action.run(); 
    } 
} 

这将用作:Command.run(text)

这允许你把同在一个地方的命令相关联的所有逻辑可以很容易地更改匹配文本的逻辑(例如忽略空格,情况)通过更改过滤器。这个枚举也是一个单例,但是该语言正在处理初始化它的所有复杂性。