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.
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
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.
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.
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.
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 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