2016-06-18 13 views
2

Ich habe eine Menge von Methoden, die wie folgt aussehen:Eineine einstellbaren/variable Schaltergehäuse in Java

switch(myEnum) { 
    case a : 
    case b : 
    case c : 
    case d : 
     modifier = 1.1; 
     break; 
    default : 
     break; 
} 

Es wäre perfekt, wenn ich die Gelegenheit habe jeden Fall und den Modifikator variabel zu machen, so dass ich kann eine Methode mit 6 Parametern haben, 4 für die Fälle und 2 für den Modifikator. So etwas wie die folgenden (Pseudo-):

public void setModifier(case1, case2, case3, case4, modifier, value) { 
    switch(myEnum) { 
     case case1 : 
     case case2 : 
     case case3 : 
     case case4 : 
      modifier = value; 
      break; 
     default : 
      break; 
    } 
} 

Modifikator und Wert sollte kein Problem sein, aber wie löse ich die variable Schalt Fälle? Ist das in Java sogar mit einer switch-Anweisung möglich?

+0

Warum nicht verwenden wenn statt Schalter verwenden? – SMA

+1

'Modifikator' wird nur von der Änderung in der Methode beeinflusst. Zeig uns das praktische Beispiel, denn dieses ist ziemlich unklar. –

+0

Möchten Sie Modifier die Modifikatorvariable in Switch Fällen – ThiepLV

Antwort

5

Es gibt mehrere Probleme mit diesem Ansatz:

  • Sie den Wert eines Parameters ändern kann übergeben, so dass der Wert für den anrufenden Code (in Java geändert wird, mit Ausnahme eines Halters Art Art wie AtomicReference usw.).
  • Der Versuch, Code generisch wegen der möglichen Wiederverwendung zu machen, ist nicht immer eine gute Idee, dies neigt dazu, komplexen generischen Code anstelle von lesbaren spezifischen zu erstellen.
  • Es sieht aus wie Ihr Code ist meistens ein wenn, also warum notieren Sie es auf diese Weise?

Wenn ich Ihr Snippet richtig verstehen, würde ich folgenden Inline-Ansatz versuchen:

if (EnumSet.of(a, b, c, d).contains(myEnum)) { 
    modifier = 1.1; 
} 

Das aus meiner Sicht ist viel sauberer und hat daher weniger Notwendigkeit, sie in allgemeiner Weise zu extrahieren und sehr flexibel (eine beliebige Anzahl von Enum-Werten und jede Art von Aktion möglich).

Wenn Sie wirklich einen solchen Ansatz benötigen, kann eine funktionale Schnittstelle die Arbeit erledigen:

setModifier(myEnum,() -> modifier = 1.1, a, b, c, d); 

public <E extends Enum<E>> void setModifier(E current, Runnable action, E... allowed) { 
    Arrays.stream(allowed) 
     .filter(one -> one == current) 
     .findAny() 
     .ifPresent(found -> action.run()); 
} 

Wie man sehen kann dies viel mehr Code erstellt, die nicht notwendig ist, wenn auch nicht sehr oft Ausbreitung um Klassen verwendet. Der obige Code funktioniert nur für modifier, das aufgrund des impliziten endgültigen Verhaltens ein Member ist keine lokale Variable.

+0

Ist dieses EnumSet die Klasse java.util? Ich kann dieses genaue Stück Code nicht neu erstellen, aber es sieht vielversprechend aus. EDIT: Es funktioniert, das ist genau das, was ich brauchte, super kompakt. – leimooo