2017-11-08 1 views
0

Unter Code habe ich geschrieben, um die switch-case-Anweisung für jede Bedingung auszuführen. Jetzt denke ich, die switch-case-Anweisung zu entfernen und ein Designmuster anzuwenden, um dieses Problem zu beheben. // Haupt Iteration - für jedes Blatt für (Entry >> Eintrag: testCaseSheetsDataMap.entrySet()) {Gibt es eine Alternative für Switch Case-Anweisungen in Java? Irgendein gutes Entwurfs-Muster? My Switch case Anweisung Zunehmend Wie zu vermeiden

  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 
+1

Sie suchen nach Ersatz mit Polymorphismus. – chrylis

+0

Warum möchten Sie 'switch' ersetzen? Welche Probleme hast du damit? – talex

+0

Ich lese Daten aus Excel und manchmal meine Case-Anweisung wird in Excel geändert mein Switch-Fall wird nicht funktionieren. Deswegen möchte ich ersetzen – Sunil

Antwort

0

In Ihrem Fall können Sie eine HashMap<string,Constants> schreiben und laufen so etwas wie:

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

und zusätzlich können Sie einen HashSet<string>() vorstellen, wo Sie alle Zeichenfolgen für die runMegaMenu -Methoden speichern und als Sie es folgendermaßen überprüfen konnte:

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

Aber zurück zu Ihrer Frage. Switch-Gehäuse kann in der Regel durch Polymorphismus vermieden werden Ich persönlich bevorzuge die Strategie-Muster für Fälle wie Ihr Beispiel.

0

Wie erwähnt, können Sie polymorphism und Strategy Muster verwenden.

Zum Beispiel können Sie Map<String, BiConsumer<CitiMainAuxiliary, List<Map<String, Object>>> strategies erstellen und füllen es

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

Danach statt switch-Anweisung Sie strategy = strategies.get(testCaseName); strategy.accept(...)

verwenden können, wenn Sie nicht mehr als 8 Java verwenden, können Sie eine Schnittstelle und die Verwendung erstellen können Map<String, YourInterface> anstelle von Karte von BiConsumer. Vielleicht ist die Implementierung mit Schnittstellen besser, weil in jeder bestimmten Klasse können Sie Ihre Konstanten initialisieren, wie COOKIED oder OBO