Introduction
Java Optional est un conteneur d’objet qui peut ou non contenir une valeur non nulle. Il offre une alternative plus sûre à null
, en évitant les exceptions NullPointerException
.
Problème
Avant de plonger dans l’utilisation d’Optional, comprenons quel problème il promet de résoudre. Lorsque nous créons une application Java, nous utiliserons sûrement le chaînage de méthodes pour déréférencer les propriétés des objets, ce qui peut facilement nous faire tomber dans le piège de NullPointerException.
String authorZipCode = book.getAuthor().getAddress().getZipCode();
Dans le fragment de code ci-dessus, il pourrait y avoir une NullPointerException dans n’importe quelle invocation de méthode get.
Par conséquent, la classe Optional résout ce problème en enveloppant l’objet que nous voulons et en le manipulant.
L’utilisation incorrecte de Java Optional peut entraîner des erreurs et une mauvaise performance. Par exemple, déclarer des champs d’une classe ou dans un constructeur avec Optional n’est pas recommandé. De plus, l’appel à Optional.get()
sans vérifier au préalable si une valeur est présente peut entraîner une exception NoSuchElementException
.
Solution
Au lieu d’utiliser une annotation Java, qui n’est pas vérifiée à la compilation, Optional
vous permet d’améliorer vos méthodes et d’indiquer que votre méthode peut retourner des valeurs “vides” (et non null).
Au lieu d’utiliser une annotation Java, qui n’est pas vérifiée à la compilation, Optional
vous permet d’améliorer vos méthodes et d’indiquer que votre méthode peut retourner des valeurs “vides” (et non null).
Voici quelques bonnes pratiques pour utiliser Java Optional :
Utilisez Optional uniquement pour les retours de méthode : Cela permet d’éviter les erreurs
NullPointerException
lors de l’appel à des méthodes qui peuvent retournernull
.Initialisez les variables Optional avec
empty()
au lieu denull
: Depuis Java 8, vous pouvez initialiser une variable Optional avecOptional.empty()
. Par exemple :Optional<String> refMoe = Optional.empty();
N’utilisez jamais
Optional.get()
sans vérifier au préalable si une valeur est présente : Utilisez toujoursOptional.isPresent()
avant d’appelerOptional.get()
. Sinon, vous risquez de rencontrer une exceptionNoSuchElementException
.Utilisez
orElse(null)
pour retournernull
: Cette méthode doit être utilisée uniquement pour des valeurs fixes commeCollections.empty()
, etc.
Discussion sur chaque point
Utilisation de isPresent
Optional<String> optional = getOptional();
if (optional.isPresent()) {
System.out.println(optional.get());
}
ifPresent
et ifPresentOrElse
optional.ifPresent(value -> System.out.println(value));
optional.ifPresentOrElse(
value -> System.out.println(value),
() -> System.out.println("Value not present")
);
orElse
, orElseGet
, orElseThrow
String value = optional.orElse("default");
value = optional.orElseGet(() -> "default");
value = optional.orElseThrow(() -> new RuntimeException("Value not present"));
Optional et les collections
// Mauvaise pratique
Optional<List<String>> optionalList = getOptionalList();
// Bonne pratique
List<String> list = getList(); // Retourne une liste vide si aucune valeur n'est présente
Éviter l’abus d’Optionals
// Mauvaise pratique
Optional<String> optional = Optional.of("value");
// Bonne pratique
String value = "value";
Éviter l’utilisation des Optionals pour les arguments de méthode et les champs
public class MyClass {
private Optional<String> value; // Mauvaise pratique
public void myMethod(Optional<String> value) { // Mauvaise pratique
// ...
}
}
map
et flatMap
Optional<String> optional = getOptional();
optional.map(value -> value.toUpperCase());
optional.flatMap(value -> getAnotherOptional(value));
Éviter l’utilisation excessive de isPresent
et get
// Mauvaise pratique
if (optional.isPresent()) {
String value = optional.get();
}
// Bonne pratique
optional.ifPresent(value -> System.out.println(value));
En suivant ces bonnes pratiques, vous pouvez utiliser Java Optional efficacement et en toute sécurité.
J’espère que ces exemples vous aideront à comprendre comment utiliser efficacement Java Optional.
😊
Aucun commentaire:
Enregistrer un commentaire
to criticize, to improve