web-dev-qa-db-fra.com

Existe-t-il une meilleure façon de faire un chèque vide en Java?

Cela pourrait ressembler à une question primitive ou cela pourrait être fait par une méthode de bibliothèque d'utilitaires simple que je ne connais pas.

L'objectif est de vérifier la valeur d'un champ booléen imbriqué sous deux objets.

private boolean sourceWebsite(Registration registration) {
    Application application = registration.getApplication();
    if (application == null) {
        return true;
    }

    Metadata metadata = application.getMetadata();
    if (metadata == null) {
        return true;
    }

    Boolean source = metadata.getSource();
    if (source == null) {
        return true;
    }

    return !source;
}

Je sais que cela pourrait être fait dans une seule if(). J'ai ajouté plusieurs if ici pour des raisons de lisibilité.

Existe-t-il un moyen de simplifier les instructions if ci-dessus et d'avoir une classe utilitaire simple qui renvoie la valeur de Boolean source Si le parent s'oppose ou non à null?

23
codeMan

Vous pouvez utiliser Java.util.Optional de cette manière:

private boolean sourceWebsite(Registration registration) {
    return Optional.of(registration)
        .map(Registration::getApplication)
        .map(Application::getMetadata)
        .map(Metadata::getSource)
        .map(source -> !source)
        .orElse(Boolean.TRUE);
}

En bref, cela retournera true si l'un des getters retourne null, et !Metadata.source autrement.

38
ernest_k

Ce qui suit retournera vrai si l'un des est nul. Si toutes les valeurs ne sont pas nulles, elle renvoie !source.

private boolean sourceWebsite(Registration registration) {
      return registration.getApplication() == null 
      ||     registration.getApplication().getMetadata() == null
      ||     registration.getApplication().getMetadata().getSource() == null
      ||    !registration.getApplication().getMetadata().getSource();

}

Mise à jour:

Si vous voulez que chaque getter ne soit pas appelé plus d'une fois, vous pouvez déclarer une variable pour chaque objet comme

private boolean sourceWebsite(Registration registration) {
      Application application;
      Metadata metadata;
      Boolean source;
      return (application = registration.getApplication()) == null 
      ||     (metadata = application.getMetadata()) == null
      ||     (source = metadata.getSource()) == null
      ||    !source;

 }
15
Khalid Shah

Une autre option que vous pouvez utiliser est un bloc try-catch. Si vous obtenez une exception de pointeur nul, retournez true.

private boolean sourceWebsite(Registration registration) {
    try {
        return !registration.getApplication().getMetadata().getSource();
    }
    catch (NullPointerException e) {
        return true;
    }
}
2
CaptianObvious