【问题标题】:Is there Any Alternative for Switch Case Statements in Java ? Any Good Design Pattern ? My Switch case Statement Increasing How to AvoidJava 中的 Switch Case 语句有什么替代方案吗?有什么好的设计模式吗?我的 Switch case 语句增加如何避免
【发布时间】:2018-06-04 20:39:18
【问题描述】:

在下面的代码中,我编写了为每个条件执行 switch-case 语句。 现在我正在考虑删除 switch-case 语句并应用一些设计模式来克服这个问题。 // 主迭代 - 对于每个工作表 for (Entry>> entry : testCaseSheetsDataMap.entrySet()) {

            String sheetNameKey = entry.getKey().trim();
            String testCaseName = testCaseSheetMasterMap.get(sheetNameKey).trim();
            List<Map<String, Object>> executableRowsList = new ArrayList<Map<String, Object>>();
            executableRowsList = entry.getValue();

            CitiMainAuxiliary auxiliary = new CitiMainAuxiliary();

            switch (testCaseName) {

            case "Anonymous Mode Log In":
                auxiliary.runAllLogin(executableRowsList, testCaseName, Constants.ANONYMOUS);
                break;
            case "Login Mode":
                auxiliary.runAllLogin(executableRowsList, testCaseName, Constants.LOGIN);
                break;
            case "Cookied Mode Login":
                auxiliary.runAllLogin(executableRowsList, testCaseName, Constants.COOKIED);
                break;
            case "OBO Mode Login":
                auxiliary.runAllLogin(executableRowsList, testCaseName, Constants.OBO);
                break;

            case "Anonymous Mode Megamenu":
                auxiliary.runMegaMenu(executableRowsList, testCaseName, Constants.ANONYMOUS);
                break;
            case "Login Mode Megamenu":
                auxiliary.runMegaMenu(executableRowsList, testCaseName, Constants.LOGIN);
                break;
            case "Cookied Mode Logon - Megamenu Check":
                auxiliary.runMegaMenu(executableRowsList, testCaseName, Constants.COOKIED);
                break;
            case "OBO Logon - Megamenu Check":
                auxiliary.runMegaMenu(executableRowsList, testCaseName, Constants.OBO);
                break;

            }

        } // end-for testCaseSheetsDataMap

【问题讨论】:

  • 您正在寻找 Replace Conditional with Polymorphism。
  • 为什么要替换switch?你有什么问题?
  • 我正在从 Excel 读取数据,有时我的 case 语句在 Excel 中被修改,我的 switch case 将无法工作。因为那个想换

标签: java switch-statement


【解决方案1】:

在你的情况下,你可以写一个HashMap&lt;string,Constants&gt; 并运行类似的东西:

auxiliary.runMegaMenu(executableRowsList, testCaseName, map.get("Login Mode Megamenu"));

此外,您可以引入一个HashSet&lt;string&gt;(),在其中存储runMegaMenu-方法的所有字符串,然后您可以通过以下方式对其进行检查:

if(set.contains(testCaseName)){
   auxiliary.runMegaMenu(executableRowsList, testCaseName, map.get(testCaseName));
}else{
   auxiliary.runAllLogin(executableRowsList, testCaseName, map.get(testCaseName));
}

但回到你的问题。 多态性通常可以避免切换案例。对于您的示例等案例,我个人更喜欢 策略模式

【讨论】:

    【解决方案2】:

    如前所述,您可以使用polymorphismStrategy 模式。

    例如,您可以创建Map&lt;String, BiConsumer&lt;CitiMainAuxiliary, List&lt;Map&lt;String, Object&gt;&gt;&gt; strategies 并填充它

    strategies.put("Anonymous Mode Log In", (aux, list)-> aux.runAllLogin(list,...))
    

    之后,您可以使用 switch 语句代替 strategy = strategies.get(testCaseName); strategy.accept(...)

    如果您不能使用 Java 8,您可以创建一个接口并使用 Map&lt;String, YourInterface&gt; 代替 BiConsumer 的映射。也许接口的实现会更好,因为在每个特定的类中你都可以初始化你的常量,比如COOKIEDOBO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2013-09-24
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多