Ich habe eine Situation, in der ich mehrere Bedingungen überprüfen muss, wobei jede Kombination ein anderes Ergebnis hat. In meiner spezifischen Bedingung habe ich 2 Variablen, die Enum-Typen sind, die jeweils 2 verschiedene Werte sein können.
%Vor%Das gibt mir 4 mögliche Bedingungen, die 4 verschiedene Ergebnisse erfordern. Ich habe mir verschiedene Möglichkeiten ausgedacht, entweder if-Anweisungen oder switch-Anweisungen:
%Vor%Oder:
%Vor%Ich habe an andere gedacht, aber ich möchte das nicht mit Code füllen: P Ich würde gerne wissen, was der beste Weg ist, dies zu tun. Ich denke, der Schalter ist ein bisschen einfacher zu lesen, aber die Wenns sind kürzer. Ich denke, es wäre wirklich cool, wenn Switches mehrere Bedingungen haben könnten, aber ich habe noch nichts davon gehört. Dies wirft auch die Frage auf: Was ist der beste Weg, dies mit einer beliebigen Anzahl von Variablen und möglichen Werten zu tun?
Für Ihren kleinen Anwendungsfall würde ich wahrscheinlich verschachtelte if
-Anweisungen verwenden. Aber wenn Sie viele enum
-Konstanten haben, könnte ein Muster, das Streams verwendet, Ihren Code möglicherweise leichter lesen und warten lassen (für eine kleine Leistungseinbuße). Sie könnten es mit einem Stream wie folgt lösen:
Das würde eine unterstützende Klasse erfordern:
%Vor% Ich bevorzuge die if
Variante ohne Verschachtelung, da sie kurz ist und Sie alle Bedingungen in einer Zeile haben.
Wenn Sie während des Debuggens den Code stoppen, kann es jedoch mühsam werden, da Sie alle vorhergehenden Bedingungen, die O (n) sind, übergehen müssen. Bei der Ausführung des Codes sollte dies keine Rolle spielen, da der Compiler den Code wahrscheinlich optimieren wird.
Es gibt keinen offensichtlichen besten Weg, also müssen Sie etwas experimentieren.
Ich bevorzuge definitiv die flache Version, es könnte einfach ein wenig weniger Duplizierung verwenden:
%Vor% Führen Sie hier aus. Sie könnten es vielleicht sogar noch kürzer und weniger redundant machen, indem Sie einen statischen Import der Enums machen , um zu vermeiden, die Enum-Namen, z. %Code%. Oder wenn Sie bereit sind, einige Kompilierzeitsicherheit aufzugeben, können Sie eine Zeichenfolge übergeben, die in die zwei Enum-Werte konvertiert wird, z. tes.t(COND_1, COND_B)
(die Implementierung bleibt dem Leser überlassen).
Wenn ich Sie wäre, würde ich mich auf Bit-Flags verlassen, um nur einen byte
zu haben (da Sie nur 4 Anwendungsfälle haben), um eine switch
-Anweisung auf diesem byte
zu verwalten Anwendungsfälle.
In etwa so:
%Vor%Dann wären Ihre Tests:
%Vor%Ich persönlich würde das vorziehen:
%Vor%Und die Namen der Methoden könnten lauten: isOrderShippedAndDelivered (), isRequestSendAndAckRecieved ().
Der Grund ist, dass dadurch der Code viel lesbarer wird. Wenn Sie keine Daten haben, die Sie zu diesen if-Anweisungen zurückführen, wird es nicht viel Gewinn machen, diese zu optimieren.
Siehe: Ссылка
Die Art hängt von der Komplexität des Codes und der Anzahl der Kombinationen ab, aber eine andere Option ist ein Wörterbuch mit dem Schlüssel, der ein Tupel Ihrer Enumerationen und einen Wert eines Delegaten für den Code enthält.
Tags und Links java performance conditional