[Java] Erfahren Sie, wie Sie Optional richtig verwenden

Optional ist eine praktische API, die reduziert, ob Anweisungen für die Nullprüfung ... Ich hatte eine Zeit, in der ich so dachte.

Nehmen Sie als Beispiel die Klasse "IntegerList", die eine Liste und Elemente von Ganzzahlen enthält, die null enthalten.

IntegerList.java


import java.util.List;
import java.util.Arrays;

public class IntegerList {
    //Liste der Ganzzahlen, die null enthalten
    private final static List<Integer> INTEGER_LIST = Arrays.asList(new Integer[]{1, 2, null});
    
    public static Integer get(int index) {
        return INTEGER_LIST.get(index);
    }
}

Bereiten Sie eine Main-Klasse vor, die ein numerisches Element aus der obigen IntegerList erhält, 100 hinzufügt und es ausgibt. In Anbetracht der Möglichkeit, dass der Rückgabewert von "IntegerList # get" null ist, setzen Sie -1, wenn er null ist.

Wenn Sie Optional nicht verwenden

Main.java


/**
 *Holen Sie sich den Wert aus IntegerList, addieren Sie 100 und geben Sie aus
 **/
public class Main {
    public static void main(String[] args) throws Exception {
        Integer value = IntegerList.get(2);
        //Wenn null-Auf 1 setzen
        if (value == null) {
            value = -1;
        }
        value += 100;
        System.out.println("Ergebnis:" + value);
    }
}

Ergebnis: 99

Bei Verwendung von Optional

Sie können es wie folgt schreiben:

Main.java


import java.util.Optional;

/**
 *Holen Sie sich den Wert aus IntegerList und addieren Sie 100
 **/
public class Main {
    public static void main(String[] args) throws Exception {
        //Ruft das Element aus der IntegerList-Klasse ab. Wenn null-Auf 1 setzen.
        Integer value = Optional.ofNullable(IntegerList.get(2)).orElse(-1);
        value += 100;
        System.out.println("Ergebnis:" + value);
    }
}

Die if-Anweisung verschwand und ich konnte sie in eine Zeile schreiben.

Der Code ist sauber! Optional Praktisch! !! Es scheint, dass wir nicht mit der Geschichte enden sollten.

Was ist los

Wenn Sie Beziehungen zwischen Klassen lose koppeln möchten Es scheint seltsam für die aufrufende Main-Klasse, den Rückgabewert von IntegerList # get optional zu machen. Ich konnte den Code schreiben, um ihn optional zu machen, da ich wusste, dass der Rückgabewert von IntegerList # get null sein kann. Was Sie wissen ist, dass die Beziehung mehr oder weniger eng ist. Wenn Sie dagegen nicht die Möglichkeit bemerken, null zu werden, werden weder eine Optionalisierung noch eine Nullprüfung geschrieben, und Sie lassen das Auftreten von "NullPointerException" zu.

Lösung

Anstatt dass der Anrufer den Rückgabewert optional macht, gibt der Angerufene Optional als Rückgabewert zurück.

IntegerList.java


import java.util.List;
import java.util.Arrays;
import java.util.Optional;

public class IntegerList {
    //Ein Array von Ganzzahlen, die null enthalten
    private final static List<Integer> INTEGER_LIST = Arrays.asList(new Integer[]{1, 2, null});
    
    //Da der Rückgabewert möglicherweise null enthält, schließen Sie ihn in Optional ein und geben Sie ihn zurück.
    public static Optional<Integer> get(int index) {
        return Optional.ofNullable(INTEGER_LIST.get(index));
    }
}

Main.java


import java.util.Optional;

/**
 *Holen Sie sich den Wert aus IntegerList und addieren Sie 100
 **/
public class Main {
    public static void main(String[] args) throws Exception {
        //Ruft das Element aus der IntegerList-Klasse ab. Wenn null-Auf 1 setzen.
        Optional<Integer> optionalValue = IntegerList.get(2);
        Integer value = optionalValue.orElse(-1) + 100;
        System.out.println("Ergebnis:" + value);
    }
}

Durch Festlegen von Optional als Rückgabewert kann klar angegeben werden, dass der Rückgabewert von ** IntegerList # get null sein kann, und der Aufrufer wird gezwungen, unter Berücksichtigung von null zu codieren. ** **. Dadurch wird verhindert, dass der Aufrufer vergisst, das Null-Urteil zu schreiben, und eine NullPointerException erhält.

Referenzen und Zitate

Wenn das oben genannte nicht funktioniert, können Sie sich auf Folgendes beziehen.

Zusammenfassung der Verwendung von Optional ist nicht serialisierbar

Daher wird Optional grundsätzlich nur als Rückgabewert der Methode verwendet, und es ist besser, sie nicht für das nächste Feld zu verwenden.

Verwenden Sie in Java 8 den optionalen Typ anstelle von null

Der Vorteil besteht darin, dass das Umschließen des Werts eine direkte Manipulation verhindert und dadurch die Erstellung des Programms syntaktisch unter der Annahme erzwingt, dass "der Wert möglicherweise nicht zurückgegeben wird". Kurz gesagt, es ist eine Syntax (Klasse) zum Erzwingen einer Nullprüfung.

re: Vielleicht / Nullable / Optional passt nicht wirklich zu mir.

Java Optional scheint als Rückgabewert der Methode verwendet zu werden, nicht für Argumente oder Felder. Da Java Optional ein Referenztyp ist, kann es null sein, so dass es bis zu einem gewissen Grad verständlich ist, dass es nicht als Argument verwendet werden sollte.

Java Optional

Java verfügt häufig über eine Methode, die "einen Wert zurückgibt, aber nur in bestimmten Fällen keinen Wert zurückgeben kann". 例えばjava.util.Map#get()は、キーがあればそれに紐付く値を返すが、キーが無い場合はnullを返す。 Beispielsweise gibt String # indexOf () die Position des gefundenen Zeichens zurück, gibt jedoch -1 zurück, wenn es nicht gefunden wird. Die Rolle von Optional besteht darin, den Rückgabewert einer solchen Methode auszudrücken.

Versuchen Sie es mit Java 8 Optional

Der Vorteil der Verwendung von Optional besteht darin, dass Sie in Ihrem Code deutlich machen können, dass dieser Wert möglicherweise nicht vorhanden ist. Im obigen Beispiel sind die erfassten Links und Rechts optional, sodass Sie gezwungen sind, die Verarbeitung im Falle eines leeren Vorgangs zu beschreiben, ohne vorsichtig zu sein.

10 Tips To Handle Null Effectively

As I already said, Optional was designed to indicate missing return values. One tempting case that it was not designed for and surely is not necessary is class’ fields. Obwohl es auf Englisch ist, war es hilfreich, weil es voller Gedanken über das Codieren für Null war.

Recommended Posts

[Java] Erfahren Sie, wie Sie Optional richtig verwenden
Verwendung von Java Optional
[Java] Verwendung von Map
Verwendung der Java-Klasse
[Java] Verwendung von removeAll ()
Verwendung von Java Map
Verwendung von Java-Variablen
Verwendung von HttpClient (Get) von Java
Verwendung von HttpClient (Post) von Java
[Java] Verwendung der Join-Methode
Wie man JAVA in 7 Tagen lernt
[Verarbeitung × Java] Verwendung von Variablen
[JavaFX] [Java8] Verwendung von GridPane
[Java] Verwendung von List [ArrayList]
Wie verwende ich Klassen in Java?
[Verarbeitung × Java] Verwendung von Arrays
Verwendung von Java-Lambda-Ausdrücken
[Java] Verwendung der Math-Klasse
Verwendung des Java-Aufzählungstyps
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
[Java] Verwendung der File-Klasse
Verwendung der Submit-Methode (Java Silver)
[Leicht verständliche Erklärung! ] Verwendung der Java-Instanz
[Java] Verwendung der toString () -Methode
Studieren der Verwendung des Konstruktors (Java)
Verwendung und Definition von Java-Klassen, Importieren
[Leicht verständliche Erklärung! ] Verwendung des Java-Polymorphismus
[Java] [Maven3] Zusammenfassung der Verwendung von Maven3
Verwendung der Java Scanner-Klasse (Hinweis)
[Verarbeitung × Java] Verwendung der Funktion
[Leicht verständliche Erklärung! ] Verwendung von ArrayList [Java]
[Java] Verwendung der Calendar-Klasse
[Leicht verständliche Erklärung! ] Verwendung von Java-Überladung
try-catch-finally Ausnahmebehandlung Verwendung von Java
[Leicht verständliche Erklärung! ] Verwendung der Java-Kapselung
Wie benutzt man rbenv?
Verwendung mit_option
Verwendung von java.util.logging
Verwendung der Karte
Wie benutzt man Twitter4J
Wie benutzt man active_hash! !!
[Verwendung des Etiketts]
Wie man Identität benutzt
Wie man Hash benutzt
Verwendung von Dozer.mapper
Wie benutzt man Gradle?
Verwendung von org.immutables
Verwendung von java.util.stream.Collector
Verwendung von VisualVM
Verwendung von Map
[Java] Verwendung der FileReader-Klasse und der BufferedReader-Klasse