Java: Propre façon d'éviter NullPointerException dans équivaut à des vérifications
J'ai une adresse d'objet que je veux créer une méthode equals pour. J'aurais pu faire très simple, en faisant quelque chose comme ce qui suit (raccourci un peu):
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Address other = (Address) obj;
return this.getStreet().equals(other.getStreet())
&& this.getStreetNumber().equals(other.getStreetNumber())
&& this.getStreetLetter().equals(other.getStreetLetter())
&& this.getTown().equals(other.getTown());
}
Problème est que certains de ces peut être null. Je vais en d'autres termes obtenir un NullPointerException
si il n'y a pas de rue de la lettre à cette adresse.
Comment puis-je écrire un moyen propre tout en prenant les valeurs null en compte?
- à l'aide de @NotNull annotation partout aide certainement. Ainsi fait à l'aide de chaînes vides et des tableaux vides, au lieu de la chaîne null null tableaux pour représenter quelque chose qui est "vide". Une chaîne vide est une chaîne qui ne contient pas de caractère. Un tableau vide est un tableau fait de zéro élément. "null" et les Npe sont extrêmement rares dans notre base de code, où l' @NotNull annotation est utilisée dans chaque classe, nous avons 🙂
- en outre, le concept de "l'égalité" sur mutable objet n'a pas beaucoup de sens. Vos objets immuables. Interdire la valeur null. Tout sera plus lisse.
- Bien sûr, et je le ferais si je le pouvais! Le problème est que dans ce cas, ces choses peuvent être inexistante. Par exemple, toutes les adresses ont une lettre, de sorte qu'il doit être null. Sur la question de l'immuabilité, je suis totalement d'accord, mais malheureusement ce n'est pas mon choix. Si c'était à moi, il serait.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser une méthode d'assistance comme
areEqual
si?Vous pouvez effectuer les opérations suivantes:
Java 7 a introduit la prise en charge intégrée pour ce cas d'utilisation avec java.util.Les objets de la classe, voir:
equal
méthode de vérification , où si vous utilisez d'autre si , dans le pire des cas, cela arriverait.{ }
, je laisse parfois et parfois ne le font pas. Dépend si ils font les choses plus claires ou pas. En général, j'ai tendance à les laisser si c'est un simplereturn
outhrow
déclaration. Si c'est autre chose, j'ai tendance à les ajouter.Google Goyave fournit Objets.l'égalité(Object, Object) qui vérifie l'égalité tout en tenant compte du fait que l'un des paramètres peut être null:
Il est également intéressant de souligner que les Objets a d'autres méthodes d'assistance pour la mise en œuvre de hashCode() et toString().
J'ai une classe helper Vérificateur w/une méthode statique:
ainsi, dans la méthode equals,
Il n'est pas vraiment propre façon de le faire; la meilleure option est d'avoir probablement votre IDE de générer le code pour vous. Eclipse peut le faire via la Source -> Générer hashCode() et equals() menu contextuel.
Je voudrais examiner la définition de certains de les égaux des méthodes statiques les méthodes de la classe, comme, disons, pour les objets de la Rue. De cette façon, vous ne jamais tenter d'appeler le .méthode equals() sur une valeur null.
Un exemple de fonction qui pourrait ressembler à:
Aussi, c'est une bonne pratique de mettre des contrôles comme
au début d'une fonction.
Equals
méthode que vous avez sur les objets en C#. Ce serait pratique dans ce cas.Vous pouvez utiliser Objets.l'égalité des de Lunettes de goyave ou de la EqualsBuilder de apache commons
Apache Commons Lang fournit la EqualsBuilder classe d'aide pour l'égalité comparissons. Il y a aussi un pour les codes de hachage.