[JAVA] Pensez aux 7 règles d'Optionnel

Aperçu

Lors de la conférence Devoxx US 2017 à laquelle j'ai assisté l'autre jour, j'ai appris les règles de gestion de l'Optionnel, donc j'écrirai ce que j'ai pensé en le résumant.

7 règles d'Optionnel

Mr.Stuart Marks (@stuartmarks) "Facultatif - La mère de tous les bikesheds / Facultatif - The_Mother_of_all_Bikesheds) "a été suivi. Là, sept règles ont été introduites lors de l'utilisation de java.util.Optional. ..

  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.

Veuillez vous référer aux documents ci-dessous (sauf pour la règle 7) pour ce que chacun signifie. À propos, présent indique "un état dans lequel Optionnel a une valeur (≈ Pas vide)", et présent indique "un état dans lequel Optionnel n'a pas de valeur (≈ Vide)".

Document

La version Devoxx US 2017 n'est pas encore sortie, mais il semble qu'il ait eu une session avec le même titre lors d'une autre conférence avant cela, et le matériel et la vidéo sont publiés. Cet article, si vous envisagez de démarrer avec Optionnel ou si vous débutez avec Optionnel, contient des informations très utiles à lire.

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

Famille ouElse facultative

Utilisez les méthodes get () ou Else Family pour récupérer les valeurs contenues dans Optional. La méthode get () lève une exception d'exécution NoSuchElementException lorsque l'objet facultatif est vide, vous ne devez donc pas l'utiliser à moins de vérifier avec isPresent. Normalement, vous utiliserez la méthode de la famille orElse, ou ifPresent (une méthode qui décrit le traitement à effectuer au moment de la présentation dans une expression Lambda).

Method Do absent
orElse(DEFAULT_VALUE) DEFAULT_Renvoie VALUE(Si vous spécifiez une méthode ici, elle sera exécutée à la fois par présent et absent.)
orElseGet(Object::new) Supplier.get est appelé et l'objet qui y est créé est renvoyé
orElseThrow(Exception::new) Lancer une exception

Cas où vous souhaitez utiliser activement Optional.orElseGet

On en a parlé à TL il y a quelque temps. (Référence: Utilisez orElseGet () pour récupérer la valeur d'Optionnel) Lors de la préparation de la valeur à renvoyer au moment de l'absence par l'appel de méthode, Vous devez utiliser activement orElseGet. Dans ce cas, la méthode est appelée uniquement en cas d'absence.

orElse

Chaque fois que cette ligne est exécutée, les collections.emptyList()Est appelé


.orElse(Collections.emptyList())

orElseGet

Collections uniquement en cas d'absence.emptyList()Est appelé


.orElseGet(Collections::emptyList)

Optional.get() Personnellement, j'ai pensé que "" "ʻOptional.get ()``nie la valeur de Optional et devrait être supprimé." Mais il s'avère que ce n'est pas vraiment si simple. Regardez d'abord le code ci-dessous.

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;

C'est un processus qui suit la règle de "vérifier avec isPresent puis obtenir". En cas d'absence, `return null;` `est le cas où vous voulez vous précipiter dans" Pourquoi utilisez-vous Optionnel si vous retournez null? ".

Alors pourquoi l'avez-vous utilisé?

Comme mentionné ci-dessus, la valeur est récupérée après vérification avec isPresent (), elle suit donc les règles de Mr.Marks. Cependant, l'option isPresent-> get est loin d'être meilleure qu'un simple code qui effectue une vérification nulle.

Facultatif est inférieur au code qui ne vérifie que null

  1. Facultatif est un objet, créant un objet optionnel supplémentaire qui n'a pas besoin d'être utilisé avec une simple vérification null
  2. Le code utilisant Optionnel rend impossible l'exécution d'étapes détaillées dans le débogueur.
  3. Facultatif ne peut être utilisé qu'avec Java 8 ou version ultérieure

amendement

Quand j'y pense, est-il prudent d'écrire comme ça ...

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

Optionnel est utilisé avec le filtre (continuez le traitement vers l'opérateur suivant uniquement lorsque la valeur correspond à la condition) et la carte (convertissez la valeur) dans le cas où non seulement le contrôle nul, mais également le traitement suivant sont écrits ensemble. Je pense que c'est mieux.


Cas où l'opérateur ternaire et le contrôle nul sont plus appropriés que l'utilisation facile d'Optionnel

Je pensais que M. Stuart Marks voulait dire que si vous écrivez du code en utilisant Optional comme celui ci-dessous, vous pouvez simplement utiliser l'opérateur ternaire.

Que facultatif.ouElse code


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

L'utilisation de l'opérateur ternaire est plus courte, plus facile à comprendre et élimine le besoin d'objets facultatifs inutiles.

Code d'opérateur ternaire pouvant faire de même


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

référence

Recommended Posts

Pensez aux 7 règles d'Optionnel
Pensez à la combinaison de Servlet et Ajax
À propos de la gestion de Null
À propos de la description de Docker-compose.yml
À propos des bases du développement Android
À propos facultatif
À propos du rôle de la méthode initialize
À propos du niveau de journalisation de java.util.logging.Logger
Qu'est-ce qu'un test? ・ À propos de l'importance d'un test
À propos du fonctionnement de next () et nextLine ()
À propos de l'affichage initial de Spring Framework
À propos du traitement de BigDecimal (avec réflexion)
À propos du nombre de threads de Completable Future
À propos de la méthode
À propos du paquet
À propos du guide de démarrage officiel de Spring Framework
A propos de l'ordre de description des propriétés système Java
À propos de l'idée des classes anonymes en Java
À propos de next () et nextLine () de la classe Scanner
Sortie sur la méthode, partie 2
À propos de la classe StringBuilder
Le monde de Clara-Rules (2)
Commentaire: à propos de l'interface
À propos du pipeline d'actifs
À propos de la double fonction -java
[Grails] À propos de la zone de paramétrage et des éléments de paramétrage de application.yml
À propos de l'utilité des monades dans une perspective orientée objet
Parler des mérites des variables de liaison de base de données ((1) Introduction)
À propos de la sélection d'OpenJDK
À propos du problème de blocage dans le traitement parallèle dans la version 4.0 de gem'sprockets
À propos de DI of Spring ①
Jugement du calendrier
Le monde de Clara-Rules (4)
Le monde de Clara-Rules (1)
À propos de DI of Spring ②
Le monde de Clara-Rules (3)
À propos de la méthode de longueur
À propos du module Kernel
Le monde de Clara-Rules (5)
L'idée du tri rapide
[Note technique] À propos des avantages et des inconvénients de Ruby
À propos de la méthode cartographique
À propos de la méthode des ancêtres
À propos de form. ○○ de form_with
[Sortie] À propos de la base de données
Pensez au problème JAVA = JAVAscript (nécessaire à l'avenir)
À propos de la méthode to_s.
Récapitulez les éléments supplémentaires de la classe Optional dans Java 9
L'idée de jQuery
À propos de la fonction de Spring Boot en raison de différentes versions
À propos de la troncature de String par le nombre d'octets sur Android
[Ruby] Questions et vérification du nombre d'arguments de méthode
Avez-vous déjà pensé à la définition de «mauvaise conception»?
À propos du fonctionnement de la session de lecture Java organisée chaque mois par BOF depuis 1998