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.
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
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.
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
.
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 une
NullPointerException`.
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 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