Que faire avec des champs null dans compare()?
En Java, j'utilise une classe dans laquelle certains champs peuvent être null
. Par exemple:
class Foo {
String bar;
//....
}
Je veux écrire un BarComparator pour cette classe,
private static class BarComparator
implements Comparator<Foo> {
public int compare( final Foo o1, final Foo o2 )
{
//Implementation goes here
}
}
Est-il un standard moyen de composer avec le fait que l'un des o1
, o2
, o1.bar
, o2.bar
peut être null
, sans écrit beaucoup de imbriquée if
...else
?
Cheers!
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous pourriez placer l'appel le champ méthode compareTo avec une petite méthode statique pour trier les valeurs null haute ou basse:
Simple d'utilisation (plusieurs champs est comme vous le feriez normalement):
NullPointerException
, si o1/o2 est null. Comment devez-vous traiter o1/o2 nul? OP mentionné : o1, o2, o1.bar, o2.la barre peut être null. Ou est la partie d'un comparateur de contrat: comparaison entre les valeurs null devriez jeter un NPE?null
arguments. Il est généralement préférable de prendre toutes les fausses valeurs null, ou toute autre forme illégale d'argument, le plus tôt possible (bien que je ne la remarque à la question d'origine, fait mention deo1
eto2
peut êtrenull
).Merci pour les réponses! La méthode générique et le Google Comparateurs intéressante.
Et j'ai trouvé qu'il y a un NullComparator dans le Apache Commons Collections (que nous utilisons actuellement):
Note: je me suis concentré sur le
bar
champ ici pour en garder pour le moment.Cela dépend si vous considérez une valeur null à une valeur valide de la chaîne de valeur de comparaison. est null < ou > "apple". La seule chose que je pouvais dire pour sûr, c'est que null == null. Si vous pouvez définir l'endroit où la valeur null s'inscrit dans la commande, puis vous pouvez écrire le code en conséquence.
Dans ce cas je peut choisir de jeter un NullPointerExcpetion ou IllegalArgumentException et essayer de gérer la valeur null à un niveau supérieur en ne mettant pas dans la comparaison de la première place.
Vous pouvez écrire votre Comparateur pour elle. Disons que vous avez une Personne de la classe avec la Chaîne de nom de domaine privé. getName() et setName() la méthode pour accéder au champ nom. Ci-dessous est le Comparateur de Personne de la classe.
Mise à jour:
De Java 8, vous pouvez utiliser au-dessous de l'API pour la Liste.
Le point clé ici est de travailler sur la façon dont vous souhaitez les valeurs null pour être traités. Certaines options sont les suivantes: a) assumer les valeurs null venir avant tous les autres objets dans l'ordre de tri b) assumer les valeurs null venir après tous les autres objets dans l'ordre de tri c) traiter null comme l'équivalent de quelque valeur par défaut d) traiter les valeurs null comme des conditions d'erreur. Celui que vous choisissez dépend entièrement de l'application sur laquelle vous travaillez.
Dans le dernier cas, bien sûr, vous lancer une exception. Pour les autres, vous avez besoin d'un four-way si/d'autre cas (environ trois minutes de codage que vous avez travaillé hors de ce que vous voulez que les résultats soient).
Si vous utilisez Google collections, vous pouvez trouver le Les comparateurs classe utile. Si a méthodes d'aide pour commander les valeurs null comme le plus ou moins d'éléments dans la collection. Vous pouvez utiliser composé de comparaison pour aider à réduire la quantité de code.
Il y a aussi la classe
org.springframework.util.comparator.NullSafeComparator
dans le Cadre du Printemps, vous pouvez utiliser.Exemple (Java 8):
Ce sera d'impression:
Il me semble qu'il n'y a pas une méthode pour le faire, mais de toute façon le code n'est pas si long.
Vous ne devez pas utiliser le NullComparator la façon dont vous faites - vous êtes en train de créer une nouvelle instance de la classe pour chaque opération de comparaison, et si par exemple vous êtes le tri d'une liste avec 1000 entrées, qui sera 1000 * log2(1000) des objets qui sont tout à fait superflue. Cela permet d'obtenir rapidement problématique.
Soit sous-classe, ou de lui déléguer, ou tout simplement mettre en place votre propre null check - ce n'est pas vraiment complexe:
Considérer le Client comme un POJO.Ma réponse serait :
Ou
Je pense que début de retour des déclarations serait l'autre alternative à beaucoup de fi
par exemple