[Java] Kurzschlüsse beachten (Kurzschlussauswertung)

Was ist ein Kurzschluss (Kurzschlussauswertung)?

Haben Sie von einem Kurzschluss gehört (Kurzschlussauswertung)?

[Logischer Operator] wie "<< Linke Seite >> << Logischer Operator >> << Rechte Seite >>" (https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E6 % BC% 94% E7% AE% 97% E5% AD% 90) Angenommen, es gibt einen Ausdruck (logischer Operatorausdruck). Die Kurzschlussbewertung dient dazu, die rechte Seite (zweites Argument) nur dann zu bewerten, wenn der Wert des gesamten Ausdrucks im Stadium der Bewertung der linken Seite (erstes Argument) nicht bestimmt wird. Kurze Evaluierungs-Wikipedia

Javas Kurzschlussoperator ist||Wann&&Anwendbar. Ein logischer Operator, der "und" oder "oder" bedeutet, wenn logische Operationen ausgeführt werden. Lassen Sie uns im Detail erklären, was das bedeutet.

Beispielcode

Die Methode isEmpty überprüft das Argument vom Typ String und gibt den booleschen Wert als Prüfergebnis zurück. Die zu überprüfende Bedingung ist "entweder null oder ein leeres Zeichen", aber der logische Operator, der "oder" bedeutet, ist der Kurzschlussoperator.||ist.

private static boolean isEmpty(String str) {
    if (str == null || str.isEmpty()) {
        return true;
    }
    return false;
}

Wenn das an isEmpty übergebene Argument str null ist, ist das Bewertungsergebnis der linken Seite "str == null" "true". Da das Bewertungsergebnis auf der linken Seite "wahr" ist, ändert sich das Bewertungsergebnis der if-Anweisung nicht, unabhängig davon, ob das Bewertungsergebnis auf der rechten Seite "str.isEmpty ()" wahr "oder" falsch "ist. Daher ist die Auswertung auf der rechten Seite nicht erforderlich und die Auswertung selbst wird nicht ausgeführt. Der Bewertungsprozess wird übersprungen. Wenn das Argument str beispielsweise nicht null ist, muss die rechte Seite ausgewertet und "str.isEmpty ()" ausgeführt werden.

Wenn die Bewertungsergebnisse beider Seiten durch die Bewertungsergebnisse der linken Seite bestätigt werden, führt ** Kurzschluss (Kurzschlussbewertung) ** keine unnötige Bewertung der rechten Seite durch.

Kommentar

||Wertet für Operatoren aus, ob entweder die linke oder die rechte Seite wahr ist. Wenn die linke Seite wahr ist, wird die rechte Seite nicht bewertet, da das Bewertungsergebnis abhängig von der rechten Seite nichts anderes als wahr sein kann. Wenn die linke Seite falsch ist, ist das Bewertungsergebnis wahr, wenn die rechte Seite wahr ist, und wenn falsch, ist das Bewertungsergebnis falsch, daher muss auch die rechte Seite bewertet werden.

Der Operator "&&" bewertet, ob sowohl die linke als auch die rechte Seite wahr sind. Wenn die linke Seite falsch ist, wird die rechte Seite nicht ausgewertet, da das Bewertungsergebnis je nach rechter Seite nichts anderes als falsch ist. Wenn die linke Seite wahr ist, ist das Bewertungsergebnis wahr, wenn die rechte Seite wahr ist, und wenn es falsch ist, ist das Bewertungsergebnis falsch, daher muss auch die rechte Seite bewertet werden.

Der logische Operator berechnet das Bewertungsergebnis, indem er die Bewertungen sowohl der rechten als auch der linken Seite kombiniert. Durch Verwendung des Kurzschlussoperators ist es jedoch möglich, nur einen von ihnen auszuwerten, dh die Verarbeitung zur Laufzeit zu vereinfachen.

Kurzschluss Fallstricke

Wenn das im Beispielcode an isEmpty übergebene Argument str null ist, wird die rechte Seite "str.isEmpty ()" nicht ausgeführt. Das heißt, während der Auswertung der if-Anweisung tritt keine NullPointerException auf.

Aber was ist, wenn Sie die linke und rechte Seite tauschen?

private static boolean isEmpty(String str) {
    if (str.isEmpty() || str == null) {
        return true;
    }
    return false;
}

Eine NullPointerException tritt auf, wenn die linke Seite "str.isEmpty ()" ausgewertet wird. Bei der Codierung kann es erforderlich sein, die Auswertungsreihenfolge der linken und rechten Seite auf diese Weise zu berücksichtigen.

Logischer Operator||Wann&&がショートサーキットである意識がない場合、左辺の評価によって右辺の評価自体が行われないこWannも意識できません。 Logische Java-Operatoren||Wann&&はショートサーキットであるこWannを意識してのコーディングが必要です。

Ergänzung: Über den vollständigen Bewertungsoperator

Grundsätzlich als logischer Operator in Java||Wann&&を使用するWann思いますが、ショートサーキットではない、左辺Wann右辺を必ず評価する論理演算子も存在します。|Wann&ist. Dies wird als vollständiger Auswertungsoperator bezeichnet. Es wird auch als vollständige boolesche Auswertung oder vollständige logische Auswertung bezeichnet. Ich habe Java seit einigen Jahren geschrieben, aber ich habe es nie benutzt. Es ist immer eine Kurzschlussvoraussetzung.

Dies ist jedoch auf Sprachen beschränkt, die Kurzschlussoperatoren haben, und umgekehrt haben einige Sprachen keine Kurzschlussoperatoren. Das ist richtig für VBA. Bewerten Sie immer beide Seiten.

Das Folgende ist eine Beispielimplementierung der isEmpty-Methode in VBA ohne den Kurzschlussoperator. Sie müssen jedoch die Verschachtelung vertiefen, um Ausnahmen zu vermeiden. Wenn Sie in einer solchen Sprache nicht wie im folgenden Beispiel mit vorzeitiger Rückkehr zurückkehren und darauf achten, die Methode nicht zu verlassen, wird die Verschachtelung tiefer und die Lesbarkeit nimmt ab ... Übrigens gibt es in VBA keine Null im String-String-Typ (Len (vbNullString) result ist 0, vbNullString =" " result is True, Null und Empty sind nur für den Variantentyp. ), Sammlungsart.

Function IsEmpty(ByVal list As Collection) As Boolean
    IsEmpty = True
    If list Is Nothing Then
        ' null(Zustand)Im Falle von
        Exit Function
    End If
    If list.Count = 0 Then
        'Wenn die Anzahl der Elemente 0 ist
        Exit Function
    End If
    IsEmpty = False
End Function

Recommended Posts

[Java] Kurzschlüsse beachten (Kurzschlussauswertung)
Dinge, die Sie beim Schreiben von Java beachten sollten
Java Servlet sollte die Multithread-Umgebung kennen
[Java] Dinge, die Sie bei der Ausgabe von FizzBuzz beachten sollten
[Java Silver] Hinweise zu switch-Anweisungen
Dinge, die Sie beim Schreiben von Code in Java beachten sollten
Um auf einfach zu lesenden Code zu achten
5 Dinge, die neue Programmierer beachten sollten
[Anfänger] Punkte, auf die Sie nach Java-Übungen / Vererbung / abstrakte Methode achten sollten [Anmerkung 26]
[Java] Übersicht über Java
[Schienen] Beachten Sie bei der Verwendung von Ajax die "CSRF-Maßnahmen".
Achten Sie auf die Speicherbereinigung und vermeiden Sie Speicherlecks
[Java10] Achten Sie darauf, var und generics nicht zusammen zu verwenden