[JAVA] Denken Sie an die 7 Regeln von Optional

Überblick

Auf der Devoxx US 2017-Konferenz, an der ich neulich teilgenommen habe, habe ich die Regeln für den Umgang mit Optional kennengelernt, also werde ich schreiben, was ich dachte, während ich es zusammenfasse.

7 Regeln von Optional

Mr.Stuart Marks (@stuartmarks) "Optional - Die Mutter aller Bikesheds / Optional - The_Mother_of_all_Bikesheds) "wurde besucht. Dort wurden sieben Regeln eingeführt, wenn [java.util.Optional] verwendet wurde (https://docs.oracle.com/javase/jp/8/docs/api/java/util/Optional.html). ..

  1. Never, ever, use null for an Optional variable or return value.
  2. Never use Optional.get() unless you can prove that the Optional is present.
  3. Prefer alternatives to Optioal.isPresent() and Optional.get().
  4. It’s generally a bad idea to create an Optional for the specific purpose of chaining methods from it to get a value.
  5. If an Optional chain has a nested Optional chain, or has an intermediate result of Optional, it’s probably too complex.
  6. Avoid using Optional in fields, method parameters, and collections.On a related note, I thought of another rule after I presented the session:
  7. Don’t use an Optional to wrap any collection type (List, Set, Map). Instead, use an empty collection to represent the absence of values.

Bitte beziehen Sie sich auf die folgenden Materialien (mit Ausnahme von Regel 7), was jede bedeutet. Übrigens zeigt vorhanden "den Zustand an, in dem Optional einen Wert hat (≈ nicht leer)", und vorhanden zeigt "den Zustand an, in dem Optional keinen Wert hat (≈ leer)".

Dokument

Die Devoxx US 2017-Version wurde noch nicht veröffentlicht, aber es scheint, dass er zuvor auf einer anderen Konferenz eine Sitzung mit demselben Titel hatte, und das Material und das Video werden veröffentlicht. Wir empfehlen Ihnen, diesen Artikel zu lesen, da er sehr nützliche Informationen für diejenigen enthält, die über die Verwendung von Optional nachdenken oder kürzlich mit der Verwendung von Optional begonnen haben.

Format Link
Dokument https://stuartmarks.files.wordpress.com/2016/09/optionalmotherofallbikesheds3.pdf
Video https://www.youtube.com/watch?v=Ej0sss6cq14
Twitter Hashtag https://twitter.com/hashtag/DevoxxOptional?src=hash

Optionale orElse-Familie

Method Do absent
orElse(DEFAULT_VALUE) DEFAULT_Gibt VALUE zurück(Wenn Sie hier eine Methode angeben, wird diese sowohl von Anwesenden als auch von Abwesenden ausgeführt.)
orElseGet(Object::new) Supplier.get wird aufgerufen und das dort erstellte Objekt zurückgegeben
orElseThrow(Exception::new) Eine Ausnahme auslösen

Fälle, in denen Sie Optional.orElseGet aktiv verwenden möchten

Es wurde vor einiger Zeit in TL darüber gesprochen. (Referenz: Verwenden Sie orElseGet (), um den Wert von Optional abzurufen) Wenn Sie den Wert vorbereiten, der zum Zeitpunkt der Abwesenheit durch den Methodenaufruf zurückgegeben werden soll, Sie sollten orElseGet aktiv verwenden. In diesem Fall wird die Methode nur aufgerufen, wenn keine vorhanden ist.

orElse

Immer wenn diese Zeile ausgeführt wird, Sammlungen.emptyList()Wird genannt


.orElse(Collections.emptyList())

orElseGet

Sammlungen nur bei Abwesenheit.emptyList()Wird genannt


.orElseGet(Collections::emptyList)

Optional.get() Ich persönlich dachte, dass " Optional.get ()` `` den Wert von Optional leugnet und gelöscht werden sollte. " Aber es stellt sich heraus, dass es nicht wirklich so einfach ist. Schauen Sie sich zuerst den folgenden Code an.

isPresent&get


final Optional<Bounds> caretBoundsOr = editor.getCaretBounds();
if (caretBoundsOr.isPresent()) {
    final Bounds bounds = caretBoundsOr.get();
    return new Point2D(bounds.getMinX(), bounds.getMinY() + 20);
}
return null;

Es ist ein Prozess, der der Regel "Mit isPresent prüfen und dann abrufen" folgt. Im Falle einer Abwesenheit ist `return null;` der Fall, in dem Sie in "Warum verwenden Sie Optional, wenn Sie null zurückgeben?"

Warum hast du es benutzt?

Wie oben erwähnt, wird der Wert nach Überprüfung mit isPresent () abgerufen, sodass er den Regeln von Mr.Marks folgt. Das optionale isPresent-> get ist jedoch alles andere als besser als nur Code, der eine Nullprüfung durchführt.

Optional ist Code unterlegen, der nur nach Null sucht

  1. Optional ist ein Objekt, das ein zusätzliches optionales Objekt erstellt, das nicht mit einer einfachen Nullprüfung verwendet werden muss
  2. Code mit Optional macht es unmöglich, eine detaillierte Schrittausführung im Debugger durchzuführen.
  3. Optional kann nur mit Java 8 oder höher verwendet werden

Änderung

Wenn ich darüber nachdenke, ist es sicher, so zu schreiben ...

final Optional<Point2D> pointOr
        = editor.getCaretBounds()
                .map(bounds -> new Point2D(bounds.getMinX(), bounds.getMinY() + 20));
return pointOr.isPresent() ? pointOr.get() : null;

Optional wird zusammen mit Filter (Verarbeitung nur dann zum nächsten Operator fortsetzen, wenn der Wert der Bedingung entspricht) und Zuordnung (Wert konvertieren) verwendet, wenn nicht nur die Nullprüfung, sondern auch die nachfolgende Verarbeitung zusammen geschrieben wird. Ich denke es ist besser.


Fälle, in denen der ternäre Operator & Null-Check besser geeignet ist als die einfache Verwendung von Optional

Ich dachte, Herr Stuart Marks wollte sagen, dass Sie einfach den ternären Operator verwenden können, wenn Sie Code mit Optional wie dem folgenden schreiben.

Das optional.oder Elle Code


Optional.ofNullable(runScript()).orElse("0").toString()

Die Verwendung des ternären Operators ist kürzer, einfacher zu verstehen und macht unnötige optionale Objekte überflüssig.

Code des ternären Operators, der dasselbe tun kann


final String script = runScript();
script != null ? script : "0"

Referenz

Recommended Posts

Denken Sie an die 7 Regeln von Optional
Denken Sie an die Kombination von Servlet und Ajax
Über den Umgang mit Null
Informationen zur Beschreibung von Docker-compose.yml
Über die Grundlagen der Android-Entwicklung
Über Optional
Informationen zur Rolle der Initialisierungsmethode
Informationen zur Protokollebene von java.util.logging.Logger
Was ist ein Test? ・ Über die Wichtigkeit eines Tests
Informationen zur Funktionsweise von next () und nextLine ()
Informationen zur ersten Anzeige von Spring Framework
Über die Behandlung von BigDecimal (mit Reflexion)
Über die Anzahl der Threads von Completable Future
Über die Methode
Über das Paket
Über den offiziellen Startleitfaden für Spring Framework
Informationen zur Beschreibungsreihenfolge der Java-Systemeigenschaften
Über die Idee anonymer Klassen in Java
Informationen zu next () und nextLine () der Scannerklasse
Ausgabe über die Methode, Teil 2
Informationen zur StringBuilder-Klasse
Die Welt der Clara-Regeln (2)
Kommentar: Über die Schnittstelle
Über die Asset-Pipeline
Über die Doppelfunktion -java
[Grails] Über den Einstellungsbereich und die Einstellungselemente von application.yml
Über die Nützlichkeit von Monaden aus einer objektorientierten Perspektive
Über die Vorzüge von Datenbankbindungsvariablen sprechen ((1) Einführung)
Über die Auswahl von OpenJDK
Über das Problem des Deadlocks bei der Parallelverarbeitung in gem'sprockets '4.0
Über DI des Frühlings ①
Beurteilung des Kalenders
Die Welt der Clara-Regeln (4)
Die Welt der Clara-Regeln (1)
Über DI des Frühlings ②
Die Welt der Clara-Regeln (3)
Über die Längenmethode
Informationen zum Kernel-Modul
Die Welt der Clara-Regeln (5)
Die Idee der schnellen Sortierung
[Technisches Memo] Über die Vor- und Nachteile von Ruby
Über die Kartenmethode
Über die Ahnenmethode
Informationen zum Formular. ○○ von form_with
[Ausgabe] Informationen zur Datenbank
Denken Sie an das JAVA = JAVAscript-Problem (wird in Zukunft benötigt).
Informationen zur to_s-Methode.
Fassen Sie die zusätzlichen Elemente der optionalen Klasse in Java 9 zusammen
Die Idee von jQuery
Über die Funktion von Spring Boot aufgrund unterschiedlicher Versionen
Informationen zum Abschneiden von Zeichenfolgen um die Anzahl der Bytes unter Android
[Ruby] Fragen und Überprüfung der Anzahl der Methodenargumente
Haben Sie jemals über die Definition von "schlechtem Design" nachgedacht?
Über den Betrieb der Java-Lesesitzung BOF findet seit 1998 monatlich statt