Java中的Switch Case语句是否有替代方案?任何好的设计模式?我的Switch案例声明增加如何避免

时间:2017-11-08 06:14:16

标签: java switch-statement

在Code下面,我写了为每个条件执行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

2 个答案:

答案 0 :(得分:0)

在你的情况下,你可以写一个HashMap<string,Constants>并运行类似的东西:

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

此外,您可以引入一个HashSet<string>()来存储runMegaMenu - 方法的所有字符串,然后您可以通过以下方式检查它:

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

但回到你的问题。通常可以通过多态来避免切换案例。我个人更喜欢策略模式,就像你的例子一样。

答案 1 :(得分:0)

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

例如,您可以创建Map<String, BiConsumer<CitiMainAuxiliary, List<Map<String, Object>>> strategies并填充它

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

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

如果您不能使用Java 8,您可以创建一个接口并使用Map<String, YourInterface>而不是BiConsumer的地图。也许使用接口的实现更好,因为在每个特定的类中,您可以初始化常量,例如COOKIEDOBO