[JAVA] Jugement de caractère nul / blanc à l'aide de l'option 2.0

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.

Déclencheur

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".

La nature de l'option

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.

Solution

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.

prime

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.

Recommended Posts

Jugement de caractère nul / blanc à l'aide de l'option 2.0
Null, caractères vides, espaces
Différence entre l'élément 0, le caractère nul et le caractère vide (liste de contrôle)
StringUtils.isNotBlank est pratique pour un jugement vide et un jugement nul en java