Ce qui devrait int compareTo() de retour lorsque la chaîne de paramètre est null?
Il est dit que lorsque le paramètre d'entrée est nulle, compareTo() doit lancer une exception NullPointerException. Cependant, je suis l'implémentation d'une classe qui a besoin de comparer les champs avec le type de Chaîne. Ces champs doivent pas être obligatoire. Je me demande dans ce cas,
1) Que dois-je retourner lorsque l'entrée est nulle? Toute non-null chaînes lexicographiquement plus grand ou plus petit que la valeur null?
et
2) Si cela est considéré comme une mauvaise pratique, est-il un des arguments à l'appui? Dois-je forcer l'utilisateur à utiliser les cordes à vide à la place? Si vous utilisez une chaîne vide, ne pas qui confondent le cas où le champ n'est pas applicable et dans le cas où le champ est vide? Et si une exception doit être levée, ensuite, à l'exception de l'avertissement de l'utilisateur dans le manuel, qu'aurait-elle/doit-je faire?
EDIT: je ne pourrais pas m'exprimer clairement ici, mais dans le programme que je suis en œuvre, les chaînes de caractères qui peut être null, sont autant de domaines ou d'une classe, qui ne doit pas être null. En d'autres termes, les objets comparedTo() utilise ne pouvait pas être null, juste de leur privés dans les domaines de l'. Donc dans ce cas, je crois que si j'en œuvre compareTo() correctement, il ne viole pas la transitif exigence étant donné que les classes avec des champs null pourrait être considéré comme le même toujours. Suis-je le droit ou suis-je interpréter ce mal?
Merci à vous tous pour les réponses!
OriginalL'auteur Ziyao Wei | 2011-06-06
Vous devez vous connecter pour publier un commentaire.
Oui, il n'y a pas de problème permettant
null
par exemple les champs - assurez-vous simplement que son ordre de tri est défini. Le plus naturel serait de le mettre avant ou après tous les véritables chaînes, mais vous pourriez faire quelque chose ici, il suffit de le faire de manière cohérente. (Par exemple, vous pouvez triernull
comme"null"
.)Voici un exemple de mise en œuvre pour un seul membre:
Veuillez noter que la spécification de Comparable.compareTo() a seulement une contrainte pour
o.compareTo(null)
(qui devrait se comportent comme des- null.compareTo(o)
, c'est à dire jeter un NullPointerException), mais pas commentnull
champs sont gérés (il ne mentionne pas les champs à tous, donc une classe pourrait revenir ce qu'il veut, tant que l'en oeuvre l'antisymétrie, la réflexivité et de la transitivité est assurée).La spécification de
compareTo
ne dit rien sur la façon (ou même si) pour comparer les champs d'instance des objets.La spécification de compareTo() dit " e.compareTo(null) doit lancer une exception NullPointerException'.
Oui, mais dans cette question (au moins après la modifier avant de ma réponse) il n'est pas sur la comparaison d'un objet avec
null
, mais sur la comparaison d'un objet avec un autre objet, dont l'un a unnull
champ. LecompareTo
spécification ne dit rien à ce sujet.Paulo est correct ici. La question de la première demande quoi faire quand
foo1.compareTo(foo2)
trouve quefoo2 != null
maisfoo2.someField == null
. Les spécifications que dicte le comportement lors de lafoo == null
.OriginalL'auteur Paŭlo Ebermann
De javadoc pour
Comparable
OriginalL'auteur Bala R
Ce serait une mauvaise pratique de ne pas jeter une exception parce qu'il viole les
transitiveantisymétrique de la nature de compareTo.De Comparables.compareTo documentation:
Plus important encore, c'est une mauvaise idée d'utiliser compareTo sur vos objets afin de les comparer avec des cordes, pour la même raison:
sign(obj.compareTo(str)) != -sign(str.compareTo(obj))
. Mettre en œuvre une coutume Comparateur et faire ce que vous voulez.Il est parfaitement bien de comparer deux instances d'une classe qui peut ou peut ne pas avoir de certains champs d'instance de set. Assurez-vous de mettre en œuvre de manière transitive. I. E. c1.compareTo(c2) == -c2.compareTo(c1)
Juste pour la terminologie: La condition
c1.compareTo(c2) == -c2.compareTo(c1)
est appelé en oeuvre l'antisymétrie, pas de transitivité. Transitivité est surtout la deuxième condition, votre devis (et peut-être aussi la troisième).merci, vous avez raison, et également la en oeuvre l'antisymétrie exigence est plus faible que ce que j'avais dit. Il n'a qu'à faire avec des signes, et non pas des valeurs réelles (sous réserve de la transitivité de contrainte):
sign(c.compareTo(c2)) == -sign(c2.compareTo(c1))
. J'ai ajusté la réponse; à gauche de commentaire précédent pour le contexte.OriginalL'auteur ykaganovich
Parce que la documentation de
compareTo
affirme qu'il devrait jeter unNullPointerException
, vous devez suivre ces lignes directrices afin que votre application est compatible avec l'interface de la documentation. Cette traite aussi de la question de savoir si ou non null chaînes sont lexicographiquement plus petit ou plus grand quenull
.Vous avez quelques options sur la façon de gérer cela. Si vide et non-applicables sont différentes, alors vous devriez probablement vous enroulez la corde de champ dans votre propre terrain de classe. Par exemple, disons que vous pouvez créer un type de MyField qui pourrait avoir un
isApplicable
méthode, qui indique si le champ est applicable à la présente affaire (ou quelque chose de similaire). Ou vous pouvez repenser votre modèle et assurez-vous qu'une chaîne vide et N/A sont vraiment deux choses différentes. Si elles le sont, vous avez besoin d'un moyen de différencier entre les deux.OriginalL'auteur Jeff Storey
Vous devez décider si une valeur null est supérieur ou inférieur à une valeur non nulle. Vous pouvez concevoir
compareTo
répond aux besoins de votre classe de l'ordre naturel, il n'est donc pas une mauvaise pratique.OriginalL'auteur Steve Kuo