Java: null sûre méthode compareTo
Il a été demandé avant, mais je n'ai pas trouvé une bonne mise en œuvre avec une explication.
public int compareTo(Object o)
{
if (this == null || o == null)
{
return 0;
}
Tok tmp = (Tok) o;
if (this.rang < tmp.rang)
{
return -1;
} else if (this.rang > tmp.rang ) {
return 1;
} else {
return 0;
}
}
J'ai lu deux questions similaires que j'ai trouvé encore; ils insistent sur la mise en œuvre d'une autre méthode. Je ne comprends pas pourquoi cela ne devrait pas travailler. La méthode renvoie un objet supplémentaire et il vérifie si ses une instance valide ou null
, si null
il suffit de retourner 0
; ce serait le moyen le plus facile à mettre en œuvre null-safe compareTo
.
La mise en œuvre qui a fonctionné pour moi a été:
public int compareTo(Object o)
{
if (o == null)
{
return 0;
}
Tok tmp = (Tok) o;
if (this.rang < tmp.rang)
{
return -1;
} else if (this.rang > tmp.rang ) {
return 1;
} else {
return 0;
}
}
Ce n'est pas la mise en œuvre optimale l'on doit chercher à ce que le bon peuple posté ici que de réponses. Pour mon cas particulier, c'était assez décent que ce n'est jamais null encore l'objet reçu peut être null et la mise en œuvre initiale, les états-unis si l'un des deux est de retour null 0. Donc, si l'objet est null, 0 est renvoyé.
this
est jamais null
en Java.il est probable qu'il signifie cette.someInstance
ce ne peut être null
Vous n'avez pas besoin de "innover" dans compareTo, aka réinventer la roue. Si vous utilisez un IDE, il va probablement le faire pour vous, vous laissant choisir les variables que vous souhaitez utiliser. Sinon, pensez à utiliser la Goyave est ComparisonChain. Si vous êtes heureux avec votre propre mise en œuvre, cependant, je me permets de se débarrasser de ces elses pour un code plus lisible.
cela devrait être compareTo(Tok o), pas de cast
OriginalL'auteur Sterling Duchess | 2012-11-22
Vous devez vous connecter pour publier un commentaire.
Personnellement, j'aime La goyave est
Commande
pour les nuls-sûr la comparaison. Vous pouvez spécifier#nullsFirst()
ou#nullsLast()
pour éviterNullPointerException
s.D'autres remarques importantes, la plupart des commentaires:
this
est jamaisnull
en JavaComparisonChain
si vous êtes à la mise en œuvre d'une finecompareTo()
Lors de la mise en œuvre de
Comparable
, assurez-vous de spécifier le paramètre de type, de sorte que vous obtenez le type de compilation de sécurité et ne pas avoir à utiliserinstanceof
ou jette:OriginalL'auteur Matt Ball
Retour 0 impliquerait que
this
eto
sont égales, ce qui n'est pas vrai sio
est null. Aussi,this
ne sera jamais nulle.Il dépend de l'application, bien sûr. Vous souhaitez avoir un objet qui doit être égale à null. Ce que vous de retour, il est à vous, mais si vous êtes à la recherche d'un général null méthode sûre, il n'est pas vraiment idéal.
Être complètement générique, je voudrais vérifier si
o
estnull
et, le cas échéant, de lancer une sorte d'Exception.Je n'ai pas besoin exception, j'ai un tableau de Tok[] objets je les donner à des Tableaux.sort() et j'ai Nulle exception.
Emmerioch est bon, faites-nous confiance, ne pas Null vérifier, voir ma réponse ci-dessous, mais de rendre votre code propre, d'éliminer ou d'éviter des objets null dans votre Tok[] vous voulez trier! Aller le nettoyer, Sinon vous passez beaucoup de temps à la recherche d'un bogue, vous probaly ne trouverez pas facilement.
OriginalL'auteur EMMERICH
Je ne suis pas satisfaits avec les autres réponses:
Vous ne devez PAS vérifier la valeur null dans compareTo.
Il est demandé qu'il jette à un NullPointerException, otheriwse vous gâchera vos Arbres et ont des difficultés à trouver pourquoi votre TreeMap ne fonctionne pas.
Une très recommandable méthode:
Plus pour le rendre parfait classe Tok devrait être final! (Sinon, vous pourriez avoir des problèmes
lorsque vous sous-classe de Tok. (Le soleil fait que l'Erreur dans la Classe Date)
Traitant de comparer et d'égal à égal n'est pas toujours facile, pensez à utiliser à la place des Arbres (TreeMap) une table de hachage, alors vous n'avez pas à mettre en œuvre compareTo.
Vous devez mettre en œuvre hashCode, où il vous suffit de retourner ce.a sonné.
Enfin son est fortement recommandé, mais pas obligatoire pour implémenter equals()
Oui qui d'Exception? Un Nullpointer? Que c'est bon! Vous ne devriez pas avoir un Objet Null dans votre Tok[]. Assurez-vous de ne pas ajouter null objectr à votre Tok[]
Mais c'est un problème que je sais que je peux raccourcir ma Tok[] ne pas contenir la valeur null index toutefois cela signifie que j'ai besoin de créer un autre tableau de compter le nombre de non-nulle index puis copier ce tableau dans un tableau temporaire et de tri. Son juste de complexe, je veux simplement mettre tous les éléments null à les grandes et les mettre à la fin.
Non, non, vous pouvez créer une copie de ce tableau sans éléments null, ou vous sera plus tard la recherche de votre bug pendant 3 jours ou plus, et à la fin en disant: java tri, TreeMap, hashMap a un bug. (Comme le travail de ses collègues a dit une fois ;-))
vous avez l'air d'être vraiment coincé sur l'OP en utilisant un certain type de l'auto-tri de la collecte, mais ce n'est clairement pas le cas d'utilisation.
OriginalL'auteur AlexWien
De la comparaison de deux objets peuvent être aussi nul sûre que toute autre méthode, le problème ici est qu'une méthode normale a deux paramètres, mais
compareTo
reçoit l'un et l'autre est l'objet lui-même.this
ne peut JAMAIS être nulle, ce qui voudrait dire que vous êtes l'exécution de code dans unnull
objet (pas d'exemple). Dans ce cas, unNullPointerException
vont être jetées à droite à l'invocation decompareTo
, rendant impossible l'exécution de son code.Il y a autant d'approches que les objets, parce qu'une comparaison peut être établie dans le champs d'une classe qui PEUT être null (destiné à des bouchons d'exclure des types primitifs). Donc, c'est une longue histoire courte, votre null vérifications doivent couvrir l'objet que vous recevez en tant que paramètre dans
compareTo
et les champs. En outre, si vous avez une instance externe qui contient un peu de logique (c'est à dire une classe d'utilitaires), vous devriez vérifier si cette instance est également nulle.Comme une note de côté, tout ce que vous de retour si tout objet est
null
doit être cohérente et documentée (vous pouvez revenir à -1 ou 1, à la place des zéros au début ou à la fin). Juste éviter de revenir à 0 (ce qui serait le même cas que siequals
retournétrue
pour unnull
objet.OriginalL'auteur Gamb
Étrange que cela puisse paraître, mais il n'est pas sûr. Essayez d'ajouter votre Tok de TreeSet ou TreeMap (comme une clé) et vous obtiendrez une NullPointerException. Le problème est que TreeSet de réalisation est basé sur TreeMap. Lorsque vous essayez d'ajouter(null) de la carte sous-jacente va essayer de placer vos null, le résultat sera dans NPE
TreeSet
ouTreeMap
?L'OP a dit dans un de ses commentaires , il utilise un sort() qui utilise compateTo() .
plus précisément implique l'OP est pas à l'aide d'un
TreeSet
ouTreeMap
.Le point est qu'il utilise compareTo d'une manière qui viole le compareTo() le contrat de java.
OriginalL'auteur Evgeniy Dorofeev
L'auteur insistant sur le fait qu'il ne veut pas supprimer les valeurs nulles de son
Tok[].
Voici une soultion qui permet de trier avec les valeurs NULL, et ne viole java contrats
Pour éviter cela, vous créez un compareTo à l'intérieur de la classe Tok qui viole la compareTo contrat,
vous créez un explicite NullSafeComparator:
simplifié de la classe Tok (supprimer le mot-clé static son est utilisé pour définir tous à l'intérieur d'une unité de la classe de test):
Enfin un test unitaire pour montrer:
Qui va donner comme résultat souhaité:
Comparator
s autorisé à être null-coffre-fort; la JavaDoc explicitement dit: "Contrairement àComparable
, un comparateur peut éventuellement permettre la comparaison des arguments nuls, tout en maintenant les exigences d'une relation d'équivalence."Ok, je vais enlever le Sale du code
OriginalL'auteur AlexWien
Selon la la documentation:
Donc, si vous implémentez un null-méthode sûre, son comportement sera inattendus (aka inconsitent avec la documentation et probablement avec le reste de l'API).
OriginalL'auteur kbec