Ich versuche nur herauszufinden, wie viele Mehrfachfälle für eine Java-switch-Anweisung verwendet werden können. Hier ist ein Beispiel dafür, was ich versuche:
switch (variable)
{
case 5..100:
doSomething();
break;
}
versus tun zu müssen:
switch (variable)
{
case 5:
case 6:
etc.
case 100:
doSomething();
break;
}
Irgendwelche Ideen, wenn dies möglich ist, oder was ist eine gute Alternative?
java
syntax
switch-statement
FunJavaCode
quelle
quelle
Antworten:
Leider ist dies in Java nicht möglich. Sie müssen auf die Verwendung von
if-else
Anweisungen zurückgreifen .quelle
if/elseif/else
unabhängig von der Sprache viele verschachtelte Anweisungen erfordern .Die zweite Option ist völlig in Ordnung. Ich bin mir nicht sicher, warum ein Antwortender sagte, es sei nicht möglich. Das ist in Ordnung, und ich mache das die ganze Zeit:
quelle
Aus:
Src: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
quelle
Vielleicht nicht so elegant wie einige frühere Antworten, aber wenn Sie Schaltfälle mit wenigen großen Bereichen erzielen möchten, kombinieren Sie die Bereiche vorher einfach zu einem einzigen Fall:
quelle
case 1
bedeutetvariable == 1
, was auf lange Sicht zu Verwirrung und viel Schmerz führt. Wenn Sie Kommentare in Ihren Code einfügen müssen, um ihn lesbar zu machen, haben Sie meiner Meinung nach etwas falsch gemacht.Eine objektorientierte Option zum Ersetzen von zu großen
switch
undif/else
Konstrukten besteht darin, aChain of Responsibility Pattern
zur Modellierung der Entscheidungsfindung zu verwenden.Muster der Verantwortungskette
Hier ist eine Beispielimplementierung, die auch mithilfe von Generika typsicher ist.
Dies ist nur ein kurzer Strohmann, den ich in wenigen Minuten zusammengestellt habe. Eine komplexere Implementierung könnte es ermöglichen, eine Art
Command Pattern
in dieCase
Implementierungsinstanzen zu injizieren , um sie eher zu einem Rückruf-IoC-Stil zu machen.Sobald das Schöne an diesem Ansatz ist, dass es bei Switch / Case-Anweisungen nur um Nebenwirkungen geht, werden die Nebenwirkungen in Klassen zusammengefasst, damit sie verwaltet und besser wiederverwendet werden können. Am Ende ähnelt dies eher dem Pattern Matching in einer funktionalen Sprache und das ist keine schlechte Sache
Ich werde alle Updates oder Verbesserungen zu diesem Gist auf Github veröffentlichen.
quelle
Nach dieser Frage ist es durchaus möglich.
Setzen Sie einfach alle Fälle zusammen, die dieselbe Logik enthalten, und setzen Sie sie nicht
break
hinter sich.Es ist, weil
case
ohnebreak
zu einem anderen springen wird,case
bisbreak
oderreturn
.BEARBEITEN:
Wenn wir auf den Kommentar antworten und wirklich 95 Werte mit derselben Logik haben, aber eine viel geringere Anzahl von Fällen mit unterschiedlicher Logik, können wir Folgendes tun:
Wenn Sie eine feinere Kontrolle benötigen,
if-else
ist dies die Wahl.quelle
case
Anweisungen erfordern !). Ich fürchte, ich stimme der akzeptierten Antwort zu.Grundsätzlich:
Wenn Sie wirklich einen Schalter benötigen, liegt dies daran, dass Sie für bestimmte Bereiche verschiedene Aufgaben ausführen müssen. In diesem Fall, ja, Sie werden unordentlichen Code haben, weil die Dinge komplex werden und nur Dinge, die Mustern folgen, gut komprimiert werden.
Der einzige Grund für einen Wechsel besteht darin, beim Eingeben des Variablennamens zu sparen, wenn Sie nur auf numerische Schaltwerte testen. Sie werden nicht 100 Dinge einschalten, und sie werden nicht alle dasselbe tun. Das klingt eher nach einem Wenn-Stück.
quelle
// Beispiel für nicht konformen Code
// Konforme Lösung
quelle
Ab der letzten Java-12-Version sind mehrere Konstanten in derselben Fallbezeichnung in der Vorschau-Sprachfunktion verfügbar
Es sieht aus wie:
Weitere Informationen JEP 325: Ausdrücke wechseln (Vorschau)
quelle
Dies ist mit der Vavr- Bibliothek möglich
Dies ist natürlich nur eine geringfügige Verbesserung, da alle Fälle noch explizit aufgeführt werden müssen. Es ist jedoch einfach, ein benutzerdefiniertes Prädikat zu definieren:
Match ist ein Ausdruck, daher gibt er hier so etwas wie eine
Runnable
Instanz zurück, anstatt Methoden direkt aufzurufen. Nach dem MatchRunnable
kann ausgeführt werden.Weitere Details finden Sie in der offiziellen Dokumentation .
quelle
Als Alternative können Sie Folgendes verwenden:
oder der folgende Code funktioniert auch
quelle
JEP 354: Switch-Ausdrücke (Vorschau) in JDK-13 und JEP 361: Switch-Ausdrücke (Standard) in JDK-14 erweitern die switch-Anweisung, sodass sie als Ausdruck verwendet werden kann .
Jetzt kannst du:
case L ->
):Beispiel für einen Schalterausdruck:
quelle
Eine Alternative anstelle der Verwendung fest codierter Werte könnte die Verwendung von Bereichszuordnungen in der switch-Anweisung sein:
quelle