【问题标题】:Too many if statements in JAVA [closed]JAVA中的if语句太多[关闭]
【发布时间】:2016-11-29 09:29:29
【问题描述】:

您好,我正在尝试制作一个 java 程序,用户可以在其中输入不同的命令,并且此类可以识别所有命令,并基于此调用来自 3-4 个不同类的方法。目前对于每个命令,我都有不同的 if 语句:

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

有这么多命令,我想知道是否有办法缩短它。

【问题讨论】:

  • 可能。您需要告诉我们{...} 部分的内容。
  • 您可以使用switch/case 语句。或者某种命令模式,其中命令位于HashMap
  • 使用Map<String, [something]> 定义命令和对象之间的映射,表示要做什么([something] 部分)。由于您没有告诉我们命令是什么,我们无法告诉您something 可能是什么。
  • 根据...s 是什么,this question 可能会给你一些指示。

标签: java oop


【解决方案1】:

使用带有字符串的 switch 语句会自动实现 string.equals 方法:

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

'statement' 代表您在问题中输入的 {...}。

当您的 if/else 语句开始堆积时,这是一个不错的选择。不要忘记添加default: 案例。在没有满足任何情况的情况下,它充当最终的“else”声明。

【讨论】:

    【解决方案2】:

    要扩展@Jim Garrison 的评论,

    使用 Map,第一种类型是字符串,代表命令,第二种类型是可以运行的类。如果您不需要任何命令,则使用 Runnable,并为每个命令编写一个 Runnable 实现,并在 setup 函数中创建映射条目。

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

    map.get("command").onCommand(...);

    【讨论】:

    • 我试过了,但这意味着它会创建那么多类,并且有太多的命令,因此也会有太多的类
    • 因此,您必须以一种或另一种方式执行每个命令。无论采用哪种方法,基本上在某些时候您将通过一些可能的命令来检查每个字符串。您所能做的就是尝试使其对自己更具可读性。分成类是一种相当易读的方法,但实际上决定因素是你的编码风格。
    • 哦,好的,非常感谢!
    【解决方案3】:

    嗯,首先,您在每次处理输入时检查每个 if 语句。使用 if/else if 让您的代码更简洁、更高效

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

    等等。

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

    将字符串拆分为数组
    String newString = string.split(" ");
    

    最后一件事,就是尽量让你的代码保持干净。您可能无法缩短检查时间,因此请保持代码可读性,不要将大块代码放在一个地方。

    【讨论】:

    • 你为什么要-1这个...?
    【解决方案4】:

    创建Map<String,Function>

    将字符串键设置为命令,并根据需要设置Function

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

    【讨论】:

    • 我试试看
    【解决方案5】:

    其他答案建议使用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)

    这允许您将与命令关联的所有逻辑放在一个位置,并通过更改过滤器轻松更改匹配文本的逻辑(例如忽略空格、大小写)。这个枚举也是一个单例,但语言正在处理初始化它的所有复杂性。

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多