Après tout, si j'utilise l'instruction if, j'ai pensé qu'il valait mieux ne pas utiliser du tout Optionnel. Je souhaite faire évoluer le jugement de caractère nul / vide avec Optionnel.
Sauf indication contraire, il est supposé fonctionner avec Java 1.8 ou supérieur.
Récemment, j'ai trouvé quelque chose comme ça dans le code qui "vérifie l'existence" de la chaîne de caractères, et cela m'a mis assez mal à l'aise: penser:
String uri = SystemPropertiesUtil.getPropertyOptional(Constant.URI).orElse("");
if (StringUtils.isEmpty(dkInfoGetApiUrl)) {
//Si c'est nul, je ferai quelque chose
}
Il s'agit d'une scène dans laquelle vous obtenez l'URI d'API à partir de la base de données et l'utilisez pour l'appel d'API. getPropertyOptional
est une méthode qui renvoie Facultatif.
De plus, StringUtils # isEmpty
qui apparaît dans l'instruction if est une méthode utilitaire fournie par Spring Framework.
Dans ce cas, vous pouvez simplement juger les caractères nuls / vides normalement, et il est plutôt simple de ne pas utiliser facultatif.
Cet exemple est un peu extrême, mais nous examinerons s'il est possible d'améliorer la convivialité et la sécurité en utilisant Optionnel pour le caractère général "non nul ∧ pas vide".
Facultatif est selon Javadoc
Un objet conteneur qui peut ou non contenir des valeurs non nulles.
Il dit (Facultatif (Java Platform SE 8)).
Si elle n'apparaît pas nulle lorsqu'elle est enveloppée avec Optional # ofNullabele
, la valeur peut être obtenue telle quelle, sinon elle peut être traitée séparément. En d'autres termes, il n'y a pas beaucoup de raison de renvoyer un caractère vide.
Cependant, si vous voulez vérifier à la fois que l'instance String n'est pas nulle et qu'il ne s'agit pas d'un caractère vide, gardez à l'esprit que si vous l'initialisez avec Optional # ofNullable
, il sera décoché qu'il ne s'agit pas d'un caractère vide.
Généralement, lors du jugement d'un caractère vide
Je pense qu'il existe de nombreux cas où il est jugé par une méthode statique qui renvoie un booléen. Par exemple
StringUtil.java
public static boolean isNullOrEmpty(String string) {
if (string == null || string.equals("")) return true;
return false;
}
Peut-il être remplacé comme suit?
Si vous voulez confirmer que la chaîne de caractères attendue est incluse dans Facultatif, essayez d'ajouter la méthode suivante au commun StringUtils
.
StringUtil.java
public static Optional<String> ofPresentable(String string) {
if (string == null || string.equals("")) return Optional.empty();
return Optional.of(string);
}
2020-11-17: Addendum Je suis content d'avoir une autre idée dans le commentaire, alors je l'ai ajoutée.
StringUtil.java
public static Optional<String> ofPresentable(String string) {
return Optional.ofNullable(string).filter(s -> !s.isEmpty());
//IsBlank peut être utilisé avec Java 11 ou supérieur
// return Optional.ofNullable(string).filter(String::isBlank);
}
En enveloppant la valeur de retour avec Optionnel, il est possible de spécifier la possibilité que la valeur n'existe pas. Par conséquent, jusqu'à maintenant
SomeObject object = new SomeObject();
if(id == null || id.equals("")) {
object.setId("default");
} else {
object.setId(id);
}
Où j'étais
final String idPresentable = StringUtil.ofPresentable(id).orElse("default");
SomeObject object = new SomeObject(idPresentable);
Peut être fait. Pour être honnête, il n'y a pas de grande différence dans ce que vous faites, mais en éliminant la syntaxe de contrôle, vous pouvez réduire la charge de prêter attention aux changements d'état, ce qui facilite le suivi et le changement. De plus, étant donné que la possibilité de devenir nulle peut être spécifiée, il est possible d'éviter une erreur inattendue en lançant une exception d'exécution arbitraire où la logique ne peut pas être nulle.
En d'autres termes
final String idPresentable = StringUtil.ofPresentable(id).orElseThrow(new RuntimeException("Entrée inattendue"));
SomeObject object = new SomeObject(idPresentable);
Ce n'est pas une alternative à 100% et peut ne pas convenir à certains cas d'utilisation. Cependant, je pense que ce modèle est plus efficace dans certains cas, et je voudrais certainement l'essayer à l'avenir.
Cette fois, j'ai ressenti un sérieux problème dans le traitement des chaînes de caractères, mais en préparant des méthodes similaires pour List et Map, il semble que le jugement et le traitement de l'existence des éléments dans certains cas peuvent être effectués simplement et en toute sécurité.
Par exemple
ListUtil.java
public static <T> Optional<List<T>> ofPresentable(List<T> list) {
if (list == null || list.size() == 0) return Optional.empty();
return Optional.of(list);
}
Si vous souhaitez le rendre riche, vous pouvez également déterminer si l'élément de liste contient null.