Vérifier les chaînes de “sortir” des appels pour les nuls
Disons que j'aimerais effectuer la commande suivante:
house.getFloor(0).getWall(WEST).getDoor().getDoorknob();
Pour éviter une NullPointerException, je dois faire ce qui suit si:
if (house != null && house.getFloor(0) && house.getFloor(0).getWall(WEST) != null
&& house.getFloor(0).getWall(WEST).getDoor() != null) ...
Est-il un moyen ou un autre déjà existant Utils classe qui ne présente plus élégamment, disons que quelque chose de ce genre?
checkForNull(house.getFloor(0).getWall(WEST).getDoor().getDoorknob());
- Si seulement vous avez suivi la loi de Déméter.
- Juste parce que j'ai commencé à travailler sur un projet existant, je ne peux pas l'adapter en fonction de mes ou de toute divinité grecque de la loi.
- Nous pouvons utiliser Java8 Fonctionnelle approche de l'Interface. Cochez cette réponse: stackoverflow.com/a/45319845/822314
Vous devez vous connecter pour publier un commentaire.
La meilleure façon serait de éviter la chaîne. Si vous n'êtes pas familier avec la Loi de Déméter (LoD), à mon avis vous devriez. Vous avez donné un exemple parfait d'un message de la chaîne qui est trop intime avec les classes qu'il n'a pas à en connaître.
Loi de Déméter: http://en.wikipedia.org/wiki/Law_of_Demeter
Dans le cas où vous ne peut pas éviter de briser la Loi de Déméter (LoD), comme indiqué dans la réponse choisie, et avec Java 8 l'introduction de En option, ce serait probablement la meilleure pratique pour gérer les valeurs null dans les chaînes de obtient comme la vôtre.
La
Optional
type vous permettra de tuyau de plusieurs carte des opérations (qui contiennent de recevoir des appels) dans une rangée. Null contrôles sont automatiquement gérées sous le capot.Par exemple, lorsque les objets ne sont pas initialisés, pas de print() sera faite et aucune exception n'est levée. Il nous être manipulés délicatement sous le capot. Lorsque les objets sont initialisés, l'impression sera faite.
Donc, avec votre getters de la chaîne d', il ressemblera à ceci:
Le retour de il sera quelque chose comme
Optional<Door>
qui vous permettra beaucoup plus sûr de travailler sans se soucier de la valeur null exceptions.Afin de vérifier une chaîne de obtient pour null vous pouvez avoir besoin d'appeler votre code à partir d'un fermeture. La fermeture de l'appel de code ressemblera à ceci:
Et vous l'appeler en utilisant la syntaxe suivante:
Ce code est également de type sécuritaire et, en général, il fonctionne comme prévu:
Vous pouvez placer opt méthode de partage des util classe et de l'utiliser partout dans votre application.
Vous pouvez bien sûr simplement envelopper l'ensemble de l'expression dans un bloc try-catch, mais c'est une mauvaise idée. Quelque chose de plus propre est le Objet Null modèle. Avec ça, si votre maison n'a pas de plancher de 0, elle retourne un Étage qui agit comme un Plancher, mais n'a pas de contenu réel, les Planchers, quand on lui a demandé Murs dont ils ne disposent pas rendre la pareille "Null" des Murs, etc, en bas de la ligne.
Assurez-vous que les choses qui ne peuvent pas, logiquement, être
null
ne le sont pas. Par exemple: - une maison a toujours un mur Ouest. Afin d'éviter de telles exceptions dans l'état, vous pouvez avoir des méthodes pour vérifier si l'état vous vous attendez à ce qui est présent:Il s'agit essentiellement d'un null-vérifier, mais peut-être pas toujours.
Le point est que vous devez faire quelque chose dans le cas où vous avez un
null
. Par exemple -return
ou de jeter unIllegalStateException
Et ce que vous ne devriez pas faire - ne pas attraper
NullPointerException
. Des exceptions d'exécution ne sont pas pour la chasse - il n'est pas prévu que vous pouvez récupérer à partir d'elles, ni s'il est une bonne pratique de s'appuyer sur les exceptions pour les flux logique. Imaginez que vous avez réellement ne vous attendez pas quelque chose à êtrenull
, et vous attraper (log) unNullPointerException
. Ce ne sera pas une information très utile, car beaucoup de choses peuvent êtrenull
à ce point.Il n'y a pas de
checkForNull
méthode que vous pouvez écrire qui faciliteront cela (ce n'est simplement pas comment la méthode invokation et de l'argument d'évaluation fonctionne en Java).Vous pouvez briser l'enchaînement des instructions dans plusieurs états, en vérifiant à chaque étape. Cependant, peut-être une meilleure solution est de ne pas avoir ces méthodes retournent
null
en premier lieu. Il y a quelque chose qui s'appelle la Objet Null Modèle que vous pouvez utiliser à la place.Questions connexes
!= null
états en Java?Très vieille question, mais encore en ajoutant ma suggestion:
Je dirais plutôt que d'obtenir la Poignée de la porte de la Maison, vous devriez essayer de laisser la Poignée de la porte être fournis à cette classe à partir du code d'appel, ou par la création d'une centrale de recherche spécialement pour ce but (par exemple une Poignée de porte de service)
Vous pourrait soutenir ce en java (juste pour ajouter un sucre syntaxique) à l'aide d'une techinque similaire à celui utilisé par Mockito:
ou CatchException
Mockito ne peut pas être utilisé directement depuis vérifie pas la valeur null maison et lève une exception, alors que CatchException est conçu pour un but différent.
Néanmoins peut-être quelqu'un peut suggérer où une telle fonctionnalité pourrait être trouvé.