[Java] Découvrez comment utiliser correctement Optional

Facultatif est une API pratique qui réduit les instructions if pour le contrôle nul ... J'ai eu un moment où je pensais de cette façon.

Prenez la classe ʻIntegerList`, qui obtient une liste et des éléments de nombres entiers contenant null, comme exemple.

IntegerList.java


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

public class IntegerList {
    //Liste des nombres entiers contenant null
    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);
    }
}

Préparez une classe Main qui récupère un élément numérique de la ʻIntegerList ci-dessus, en ajoute 100 et le produit. Considérant la possibilité que la valeur de retour de ʻIntegerList # get soit nulle, définissez -1 si elle est nulle.

Lorsque vous n'utilisez pas facultatif

Main.java


/**
 *Obtenez la valeur de IntegerList, ajoutez 100 et la sortie
 **/
public class Main {
    public static void main(String[] args) throws Exception {
        Integer value = IntegerList.get(2);
        //Si nul-Définir sur 1
        if (value == null) {
            value = -1;
        }
        value += 100;
        System.out.println("résultat:" + value);
    }
}

Résultat: 99

Lors de l'utilisation en option

Vous pouvez l'écrire comme suit:

Main.java


import java.util.Optional;

/**
 *Obtenez la valeur d'IntegerList et ajoutez 100
 **/
public class Main {
    public static void main(String[] args) throws Exception {
        //Récupérez l'élément de la classe IntegerList. Si nul-Réglez sur 1.
        Integer value = Optional.ofNullable(IntegerList.get(2)).orElse(-1);
        value += 100;
        System.out.println("résultat:" + value);
    }
}

L'instruction if a disparu et j'ai pu l'écrire en une seule ligne.

Le code est propre! Pratique en option! !! Il semble que nous ne devrions pas finir avec l'histoire.

Qu'est-ce qui ne va pas

Si vous souhaitez associer vaguement les relations entre les classes Il semble étrange que la classe appelante Main rende la valeur de retour de ʻIntegerList # get facultative. J'ai pu écrire le code pour le rendre facultatif car je savais que la valeur de retour de ʻIntegerList # get pouvait être nulle. Ce que vous savez, c'est que la relation est plus ou moins étroite. Et, à l'inverse, si vous ne remarquez pas la possibilité de devenir nul, ni l'option optionnelle ni la vérification de null ne seront écrites, et vous autoriserez l'occurrence de NullPointerException.

Solution

Au lieu que l'appelant rende la valeur de retour facultative, l'appelé renvoie facultatif comme valeur de retour.

IntegerList.java


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

public class IntegerList {
    //Un tableau d'entiers contenant null
    private final static List<Integer> INTEGER_LIST = Arrays.asList(new Integer[]{1, 2, null});
    
    //Étant donné que la valeur de retour peut contenir null, enveloppez-la dans Facultatif et renvoyez-la.
    public static Optional<Integer> get(int index) {
        return Optional.ofNullable(INTEGER_LIST.get(index));
    }
}

Main.java


import java.util.Optional;

/**
 *Obtenez la valeur d'IntegerList et ajoutez 100
 **/
public class Main {
    public static void main(String[] args) throws Exception {
        //Récupérez l'élément de la classe IntegerList. Si nul-Réglez sur 1.
        Optional<Integer> optionalValue = IntegerList.get(2);
        Integer value = optionalValue.orElse(-1) + 100;
        System.out.println("résultat:" + value);
    }
}

En définissant Facultatif comme valeur de retour, il est possible d'indiquer clairement que la valeur de retour de ** ʻIntegerList # getpeut être nulle, et de forcer l'appelant à coder en tenant compte de null. ** ** Cela empêchera l'appelant d'oublier d'écrire le verdict nul et d'obtenir uneNullPointerException`.

Références et citations

Si ce qui précède ne fonctionne pas, vous pouvez vous référer à ce qui suit.

Résumé de l'utilisation de l'option facultative n'est pas sérialisable

Par conséquent, l'utilisation de Optional est essentiellement uniquement la valeur de retour de la méthode, et il est préférable de ne pas l'utiliser pour le champ suivant.

Utilisez le type facultatif au lieu de null dans Java 8

L'avantage est que l'encapsulation de la valeur dans ceci interdit la falsification directe, forçant ainsi syntaxiquement la construction du programme à supposer que "la valeur ne peut pas être retournée". En bref, c'est une syntaxe (classe) pour forcer une vérification nulle.

re: Maybe / Nullable / Optional ne me convient pas vraiment.

Java Optional semble être censé être utilisé comme valeur de retour d'une méthode, et non pas être utilisé pour des arguments ou des champs. Puisque Java's Optional est un type de référence, il est compréhensible dans une certaine mesure qu'il ne devrait pas être utilisé comme argument, étant donné que Optional lui-même peut être nul.

Java Optional

Java a souvent une méthode qui dit "renvoie une valeur, mais ne peut pas renvoyer une valeur uniquement dans certains cas". 例えばjava.util.Map#get()は、キーがあればそれに紐付く値を返すが、キーが無い場合はnullを返す。 Par exemple, String # indexOf () renvoie la position du caractère trouvé, mais renvoie -1 s'il n'est pas trouvé. Le rôle d'Optionnel est d'exprimer la valeur de retour d'une telle méthode.

Essayez d'utiliser Java 8 facultatif

L'avantage d'utiliser Optional est que vous pouvez indiquer clairement dans votre code qu'il peut ne pas avoir cette valeur. Dans l'exemple ci-dessus, les acquises gauche et droite sont optionnelles, vous serez donc obligé de décrire le traitement dans le cas de vide sans faire attention.

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. Bien qu'il soit en anglais, cela a été utile car il était rempli de réflexions sur le codage pour null.

Recommended Posts

[Java] Découvrez comment utiliser correctement Optional
Comment utiliser java Facultatif
[Java] Comment utiliser Map
Comment utiliser la classe Java
[Java] Comment utiliser removeAll ()
Comment utiliser Java Map
Comment utiliser les variables Java
Comment utiliser HttpClient de Java (Get)
Comment utiliser HttpClient de Java (Post)
[Java] Comment utiliser la méthode de jointure
Comment apprendre JAVA en 7 jours
[Traitement × Java] Comment utiliser les variables
[JavaFX] [Java8] Comment utiliser GridPane
[Java] Comment utiliser List [ArrayList]
Comment utiliser les classes en Java?
[Traitement × Java] Comment utiliser les tableaux
Comment utiliser les expressions Java lambda
[Java] Comment utiliser la classe Math
Comment utiliser le type enum Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
[Java] Comment utiliser la classe File
Comment utiliser la méthode de soumission (Java Silver)
[Explication facile à comprendre! ] Comment utiliser l'instance Java
[Java] Comment utiliser la méthode toString ()
Etudier comment utiliser le constructeur (java)
Comment utiliser et définir les classes Java, importer
[Explication facile à comprendre! ] Comment utiliser le polymorphisme Java
[Java] [Maven3] Résumé de l'utilisation de Maven3
Comment utiliser la classe Java Scanner (Remarque)
[Traitement × Java] Comment utiliser la fonction
[Explication facile à comprendre! ] Comment utiliser ArrayList [Java]
[Java] Comment utiliser la classe Calendar
[Explication facile à comprendre! ] Comment utiliser la surcharge Java
gestion des exceptions try-catch-finally Comment utiliser java
[Explication facile à comprendre! ] Comment utiliser l'encapsulation Java
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
[Java] Comment utiliser la classe FileReader et la classe BufferedReader