99 votes

Vérifier les chaînes d'appels "get" pour les nullités

Disons que j'aimerais exécuter la commande suivante :

house.getFloor(0).getWall(WEST).getDoor().getDoorknob();

Pour éviter une NullPointerException, je devrais faire ce qui suit si :

if (house != null && house.getFloor(0) && house.getFloor(0).getWall(WEST) != null
  && house.getFloor(0).getWall(WEST).getDoor() != null) ...

Existe-t-il un moyen ou une classe Utils déjà existante qui permette de faire cela de manière plus élégante, disons quelque chose comme ce qui suit ?

checkForNull(house.getFloor(0).getWall(WEST).getDoor().getDoorknob());

4voto

Laloi Points 137

La meilleure solution pour moi est d'utiliser java.util.Optional.map(..) pour enchaîner ces vérifications : https://stackoverflow.com/a/67216752/1796826

1voto

polygenelubricants Points 136838

Il n'y a pas checkForNull Vous ne pouvez pas écrire de méthode qui facilitera cela (ce n'est tout simplement pas la façon dont l'invocation de méthodes et l'évaluation des arguments fonctionnent en Java).

Vous pouvez décomposer les déclarations enchaînées en plusieurs déclarations, en vérifiant à chaque étape. Toutefois, une meilleure solution consiste peut-être à ne pas faire en sorte que ces méthodes renvoient les données suivantes null en premier lieu. Il y a quelque chose qui s'appelle Modèle d'objet nul que vous pouvez utiliser à la place.

Questions connexes

-1voto

Omar Ruiz Points 31

En implémentant le try/catch nullPointer avec un fournisseur, vous pouvez lui envoyer toute la chaîne de get.

public static <T> T getValue(Supplier<T> getFunction, T defaultValue) {
    try {
        return getFunction.get();
    } catch (NullPointerException ex) {
        return defaultValue;
    }
}

et l'appeler de cette façon.

ObjectHelper.getValue(() -> object1.getObject2().getObject3().getObject4()));

-3voto

Adriaan Koster Points 6264

Très vieille question, mais j'ajoute quand même ma suggestion :

Je suggère qu'au lieu d'obtenir la poignée de porte à partir de la maison, vous devriez essayer de faire en sorte que la poignée de porte soit fournie à cette classe à partir du code d'appel, ou en créant une fonction de consultation centrale spécifiquement destinée à cet effet (par exemple, un service DoorKnob).

-3voto

Yuebing Cao Points 119
// Example
LazyObject.from(curr).apply(A.class, A::getB).apply(B.class, B::getC).apply(C.class, C::getD).to(String.class);

// LazyObject.java
public class LazyObject {

private Object value;

private LazyObject(Object object) {
    this.value = object;
}

public <F, T> LazyObject apply(Class<F> type, Function<F, T> func) {
    Object v = value;
    if (type.isInstance(v)) {
        value = func.apply(type.cast(v));
    } else {
        value = null; // dead here
    }
    return this;
}

public <T> void accept(Class<T> type, Consumer<T> consumer) {
    Object v = value;
    if (type.isInstance(v)) {
        consumer.accept(type.cast(v));
    }
}

public <T> T to(Class<T> type) {
    Object v = value;
    if (type.isInstance(v)) {
        return type.cast(v);
    }
    return null;
}

public static LazyObject from(Object object) {
    return new LazyObject(object);
}

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X