Schreiben Sie keinen Code, wenn (isAdmin == true) in Java

Einführung

Ich denke, es ist natürlich, aber es gibt Zeiten, in denen es unerwartet nicht geschützt ist. Nehmen wir als Beispiel die Behandlung von Booleschen Werten bei der bedingten Verzweigung.

~~ Ich habe "in Java" im Titel geschrieben, aber es ist wahrscheinlich in jeder Sprache gleich. ~~ Brechen Sie es ab, da es nicht für andere Sprachen wie JavaScript [^ js] gilt.

Was ist los

Es gibt Fälle, in denen dies vom Codierungsstandard [^ 1] eindeutig abgelehnt wird, aber in Java sollte der folgende Code ** nicht geschrieben werden **.

if (isAdmin == true) {
  //Wenn isAdmin wahr ist
}

if (isAdmin == false) {
  //Wenn isAdmin falsch ist
}

Ich werde drei Gründe schreiben.

Grund 1: Es ist überflüssig

Der obige Code kann wie folgt geschrieben werden: Das ist einfacher.

if (isAdmin) {
  //Wenn isAdmin wahr ist
}

if (!isAdmin) {
  //Wenn isAdmin falsch ist
}

Im Fall von "if ~ else ~" kann es einfach sein, mit einem ternären Operator zu schreiben. Der Missbrauch des ternären Operators kann jedoch die Lesbarkeit beeinträchtigen. Weitere Informationen finden Sie im folgenden Artikel.

String userType;
if (isAdmin) {
  userType = "Administrator";
} else {
  userType = "Allgemeines";
}

//Es ist einfacher, mit dem ternären Operator wie folgt zu schreiben
String userType = isAdmin ? "Administrator" : "Allgemeines";

Wenn es wahr ist, gibt es kein Problem, aber wenn es falsch ist, gibt es Fälle, in denen ! Unauffällig ist.

if (!obj.getFoo().isBar()) {
  //wird bearbeitet
}

In solchen Fällen empfiehlt es sich, erklärende Variablen hinzuzufügen.

boolean bar = obj.getFoo().isBar();
if (!bar) {
  //wird bearbeitet
}

Grund 2: Kann mit Zuordnung verwechselt werden

In Java wird entschieden, dass die if-Anweisung als boolescher Typ geschrieben werden soll. Daher führt das Schreiben einer Zuweisung in die if-Anweisung normalerweise zu einem Kompilierungsfehler. Im Fall des booleschen Typs wird die Kompilierung jedoch ohne Warnung übergeben, selbst wenn Sie Folgendes schreiben.

if (isAdmin = true) {
  //Wenn isAdmin wahr ist ... sollte immer ausgeführt werden
}

if (isAdmin = false) {
  //Wenn isAdmin false ist, sollte es nicht immer ausgeführt werden
}

//Dies führt zu einem Kompilierungsfehler
if (isAdmin = 1) {
}

Das Schreiben in Yoda-Notation [^ yoda] wie unten gezeigt ist jedoch ein Umkippen.

if (true == isAdmin) {
  //Wenn isAdmin wahr ist
}

if (false == isAdmin) {
  //Wenn isAdmin falsch ist
}

Tatsächlich werden Sie in IDE und FindBugs / SpotBugs [^ 3] gewarnt, sodass Sie es nicht bemerken sollten. Wenn Sie jedoch nicht von Anfang an "if (isAdmin == true)" schreiben, gibt es kein Problem.

Grund 3: Langsam (theoretisch)

Der folgende Inhalt ist nur bei "b == true" und hat keine Auswirkung bei Verwendung von "b == false" oder "! B". Siehe Kommentare für Details.

Dies ist fast eine Seite, aber theoretisch wäre es nutzlos [^ 4]. Kompilieren Sie beispielsweise den folgenden Code und setzen Sie ihn in umgekehrter Reihenfolge mit "javap -c" zusammen.

public class Main {
    public int foo(boolean b) {
        if (b == true) {
            return 1;
        } else {
            return 0;
        }
    }

    public int bar(boolean b) {
        if (b) {
            return 1;
        } else {
            return 0;
        }
    }
}

Dann erhalten Sie die folgende Ausgabe (ohne irrelevante Ausgabe):

  public int foo(boolean);
    Code:
       0: iload_1
       1: iconst_1
       2: if_icmpne     7
       5: iconst_1
       6: ireturn
       7: iconst_0
       8: ireturn

  public int bar(boolean);
    Code:
       0: iload_1
       1: ifeq          6
       4: iconst_1
       5: ireturn
       6: iconst_0
       7: ireturn

Wenn Sie dies lesen, wird es wie folgt sein [^ 5]. Ich habe es schon lange geschrieben, aber der Punkt ist, dass eine Anweisung verschwendet wird.

Denn "wenn (b)" bedeutet "wenn b wahr ist", während "wenn (b == wahr)" ein Kreisverkehrsausdruck ist, der sagt "wenn b wahr ist im Vergleich zu wahr". Weil es geworden ist.

abschließend

Einige Leute mögen sagen: "Das interessiert mich nicht", aber die Anhäufung dieser kleinen Dinge wird in Zukunft einen großen Unterschied machen. Ich möchte, dass Sie nach und nach gute Gewohnheiten entwickeln.

Nachtrag

Es scheint, dass es eine Antwort gab, also werde ich sie nach und nach ergänzen.

[^ 1]: [Java-Codierungsstandards - Future Enterprise Coding Standards - Future Architect](https://future-architect.github.io/coding-standards/documents/forJava/Java%E3%82%B3%E3% 83% BC% E3% 83% 87% E3% 82% A3% E3% 83% B3% E3% 82% B0% E8% A6% 8F% E7% B4% 84.html) [^ 3]: QBA: Methode zum Zuweisen eines booleschen Literalwerts im logischen Ausdruck (QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT) -boolesche Zuweisung) [^ 4]: Ich habe es gemessen, aber ich konnte den Unterschied nicht bestätigen. Also "theoretisch". [^ 5]: Abgeleitet aus The Java® Virtual Machine Specification. [^ yoda]: [Yoda-Notation-Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A8%E3%83%BC%E3%83%80%E8%A8%98%E6 % B3% 95) usw. [^ js]: Für JavaScript: Logical Operators-JavaScript | MDN

Recommended Posts

Schreiben Sie keinen Code, wenn (isAdmin == true) in Java
Schreiben Sie Java8-ähnlichen Code in Java8
[Java] Verwenden Sie nicht "+" im Anhang!
Deklarieren Sie keine Variablen in List in Java
Ausgabe true mit if (a == 1 && a == 2 && a == 3) in Java (Invisible Identifier)
Schreiben Sie Flyway-Rückrufe in Java
Java mit Visual Studio Code
Errate den Zeichencode in Java
Führen Sie Scala's Option.or Null in Java aus
Mach HelloWorld mit Java / IntelliJ / Gradle
Java Spring-Umgebung in vs Code
Schreiben Sie den Testcode mit Spring Boot
[Rails] Was tun, wenn keine Daten in der Datenbank registriert sind?
Versuchen Sie einen If-Ausdruck in Java
Lassen Sie mich VS Code Remote Development + Java-Entwicklung in einer Proxy-Umgebung durchführen
Verwenden Sie Stream in Java?
Wie schreibt man in Scala, die in Java geschrieben wurde? (Liste → Karte)
Was tun, wenn das Präfix c in JSP nicht gebunden ist?
So führen Sie eine Basiskonvertierung in Java durch
Akzeptieren Sie System.in nicht im Gradle-Lauf
Alle gleichen Hash-Code-Zeichenfolgen in Java
Kehren Sie nicht zurück, wenn Sie Notizen in Ruby machen
Führen Sie TensorFlow in Java aus. Es ist jedoch einfach. .. .. ..
Hinzufügen, wenn nicht in Set, Fehlermeldung, wenn
[Mac] Installieren Sie Java in Visual Studio Code
In einigen Fällen habe ich Java-Code mit GraalVM nativ gemacht, ihn aber nicht beschleunigt.
Was tun, wenn die Änderungen nicht in der JAR-Manifestdatei berücksichtigt werden?
[Java] Was tun, wenn in Eclipse die Fehlermeldung "Nicht zulässig auf Quellenebene unter 1.X" angezeigt wird?
Fügen Sie in Java in Visual Studio Code die Option --enable-Preview hinzu
Techniken zum Lesen von Java-Quellcode in Eclipse
Führen Sie eine statische Code-Analyse mit Checkstyle mit Java + Gradle durch
Code zum Escapezeichen von JSON-Zeichenfolgen in Java
Zweite Abkochung: Versuchen Sie einen If-Ausdruck in Java
Lösung für NetBeans 8.2 funktioniert nicht in Java 9-Umgebung
Versuchen Sie es mit Sourcetrail (Win-Version) mit Java-Code
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Versuchen Sie es mit Sourcetrail (MacOS-Version) mit Java-Code
Schreiben Sie Selenium Java-Bindungscode mit Silk WebDriver
[AtCoder Problem-ABC001] C-Do Windbeobachtung in Java [Code]
Wie schreibe ich Java String # getBytes in Kotlin?
[Java-Anfängerangst] In Junit implementierter schwer zu testender Code
[Mac] Java in Visual Studio Code installieren (VS Code)