Java: null sicher compareTo-Methode
Es wurde vorher gefragt, aber ich habe nicht gefunden, einen anständigen Umsetzung mit einer Erklärung.
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;
}
}
Lese ich zwei ähnliche Fragen habe ich trotzdem gefunden; Sie bestehen auf der Durchführung einer anderen Methode. Ich verstehe nicht, warum das nicht funktionieren sollte. Die Methode bekommt ein extra-Objekt und prüft es, wenn Ihr eine gültige Instanz oder null
, wenn null
einfach zurück 0
; was wäre die einfachste Möglichkeit zum implementieren von null-sicher compareTo
.
Umsetzung, die für mich gearbeitet wurde:
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;
}
}
Es ist nicht die optimale Umsetzung sollte man suchen in dem, was gute Leute hier gepostet als Antworten. Für meinem speziellen Fall war anständig genug, wie das ist, nie null noch das Objekt empfangen werden können, null und die erste Implementierung Staaten, wenn entweder null ist return 0. Also, wenn ein bestimmtes Objekt null ist, wird 0 zurückgegeben.
this
nie null
in Java.er meinte wohl diese.someInstance
dies kann nie null sein
Sie brauchen nicht zu "innovieren" in compareTo, aka das Rad neu erfinden. Wenn Sie eine IDE-es wird wahrscheinlich tun es für Sie, so dass Sie wählen Sie die Variablen, die Sie verwenden möchten. Ansonsten betrachten Sie mit Guave - ComparisonChain. Wenn Sie zufrieden mit Ihrer eigenen Umsetzung, jedoch würde ich diejenigen loswerden, die Neubauten für ein sauberer code.
dies sollte compareTo(Tok o), kein cast
InformationsquelleAutor Sterling Duchess | 2012-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Persönlich mag ich Guave ist
Bestellung
für null-sicherer Vergleich. Sie können angeben,#nullsFirst()
oder#nullsLast()
zu vermeidenNullPointerException
s.Andere wichtige Hinweise, meist aus den Kommentaren:
this
ist nienull
in JavaComparisonChain
wenn Sie die Umsetzung einer feingranularencompareTo()
Bei der Umsetzung
Vergleichbar
, sicher, dass Sie den type-parameter, so erhalten Sie die compile-Zeit geben Sie Sicherheit und müssen nicht aufinstanceof
oder wirft:InformationsquelleAutor Matt Ball
0 zurückgeben würde bedeuten, dass
this
undo
gleich sind, das ist nicht wahr, wenno
null ist. Auchthis
wird nie null sein.Es ist je nach Anwendung natürlich. Vielleicht möchten Sie ein Objekt, das sollte gleich null. Was Sie zurückgeben, es ist bis zu Ihnen, aber wenn Sie sind auf der Suche für eine generelle null-sichere Methode, es ist nicht wirklich ideal.
Werden vollständig generisch ist, würde ich prüfen, ob
o
istnull
und, wenn ja, werfen irgendeine Art von Ausnahme.Ich brauche Ausnahme ich habe ein array von Tok [] - Objekte ich gebe es zu-Arrays.sort() und ich bekomme Null Ausnahme.
Emmerioch richtig ist, Vertrauen Sie uns, nicht Null überprüfen, siehe meine Antwort unten, aber machen Sie Ihren code sauber, das entfernen oder die Vermeidung von null-Objekten in Ihrem Tok [], die Sie Sortieren möchten! Gehe den sauberen Weg, Sonst verbringt man viel Zeit mit der Suche einen Fehler, die Sie wahrscheinlich nicht leicht zu finden.
InformationsquelleAutor EMMERICH
Ich bin nicht zufrieden mit den anderen Antworten:
Sie sollten NICHT auf null prüfen in compareTo.
Es wird verlangt, dass es wirft eine NullPointerException, ansonsten werden Sie mess up Ihre Bäume und Schwierigkeiten haben, warum Sie Ihre TreeMap funktioniert nicht.
Sehr Empfehlenswerte Methode:
Weiter zu machen es perfekt-Klasse Tok sollte endgültig sein! (Sonst könnten Sie Probleme haben
wenn Sie eine Unterklasse von Tok. (So erfolgt, dass Fehler in der Klasse Datum)
Umgang mit vergleichen und gleich ist nicht immer einfach, ziehen Sie die Verwendung anstelle von Bäumen (TreeMap) eine HashMap, dann Sie nicht haben zu implementieren compareTo.
Sie implementieren sollten, hashCode, wo Sie einfach zurück.klingelte.
Schließlich ist empfehlenswert, aber nicht zwingend erforderlich zum implementieren von equals()
Ja, die Ausnahme? Ein Nullpointer? Das ist gut! Sollten Sie nicht über ein Null-Objekt in Ihrem Tok[]. Stellen Sie sicher, dass Sie nicht hinzufügen, null objectr zu Ihrem Tok[]
Aber das ist ein problem von dem ich weiß, dass ich verkürzen kann mein Tok[] nicht enthalten keine null-Indizes aber das bedeutet ich brauche, um zu erstellen ein array die Anzahl der nicht-null-Indizes dann kopiere dieses array in ein temporäres array und Sortieren. Seine einfach zu Komplex ich möchte einfach alle null-Elemente an der bigest und setzen Sie Sie am Ende.
Nein, Nein, Sie konnte erstellen eine Kopie des Arrays ohne null-Elemente, oder du wirst später nach deinem bug für 3 oder mehr Tage, und am Ende sagen java-Sortieren, TreeMap, hashMap hat einen bug. (Wie arbeiten Kollegen sagte einmal ;-))
Sie scheinen wirklich fest auf den OP mit irgendeiner Art von selbst-Sortieren der Sammlung, aber das ist eindeutig nicht der Fall verwenden.
InformationsquelleAutor AlexWien
Vergleich von zwei Objekten kann als null-sicher wie jede andere Methode, der Haken an der Sache ist, dass ein normal-Methode hat zwei Parameter, aber
compareTo
erhält eine und das andere ist das Objekt selbst.this
kann NIE null sein, würde das bedeuten, dass Sie die Ausführung von code in einernull
Objekt (keine Instanz). In diesem Fall ist eineNullPointerException
wird geworfen, direkt an den AufrufcompareTo
, so dass unmöglich die Ausführung des Codes.Gibt es so viele Konzepte wie Objekte, weil eine comparation können in die Felder einer Klasse KANN null sein (bestimmt, Kappen, um auszuschließen, primitive Typen). Also, lange Geschichte kurz, Ihre null-Kontrollen erstrecken sollte, die das Objekt, das Sie erhalten, die als parameter in
compareTo
und die verwendeten Felder. Darüber hinaus, wenn Sie eine externe Instanz, die hält einige Logik (D. H. eine utilities-Klasse) sollten Sie überprüfen, ob diese Instanz ist auch null.Als eine Randnotiz, was auch immer Sie zurück, wenn alle beteiligten Objekt ist
null
müssen konsistent sein und dokumentiert werden (Sie können return -1 oder 1, die null-Werte am Anfang oder am Ende). Vermeiden Sie nur 0 zurückgeben (das wäre der gleiche Fall, als wennequals
zurückgegebentrue
für einenull
Objekt.InformationsquelleAutor Gamb
Seltsam, wie es scheinen mag, aber es ist nicht sicher. Versuchen Sie, fügen Sie Ihre Tok zu TreeSet oder TreeMap (als Schlüssel) und du bekommst eine NullPointerException. Das problem ist, dass TreeSet Verwirklichung basiert auf der TreeMap. Wenn Sie versuchen, hinzufügen(null) zugrunde liegende Karte wird versuchen, Ihre null die in der NPE
TreeSet
oderTreeMap
?Der OP sagte, in einem seiner Kommentare , die er verwendet, sort (), die verwendet compateTo() .
insbesondere impliziert die OP ist nicht mit einem
TreeSet
oderTreeMap
.Der Punkt ist, dass er verwendet compareTo in einer Weise, die gegen die compareTo () - Vertrag von java.
InformationsquelleAutor Evgeniy Dorofeev
Der Autor darauf besteht, dass er nicht wollen, entfernen Sie null-Werte aus seiner
Tok[].
Hier ist ein soultion nutzen, ermöglicht das Sortieren mit NULL-Werten, und ist nicht gegen java Verträge
Zu vermeiden, erstellen Sie eine compareTo-innen Klasse Tok, die gegen die compareTo-Vertrag,
Sie erstellen eine explizite NullSafeComparator:
vereinfachte Klasse Tok (entfernen Sie das Schlüsselwort static ist verwendet, um zu definieren, dass alle innerhalb eines unit-test-Klasse):
Endlich ein Gerät testen zu zeigen:
Geben wird, die folgende gewünschte Ergebnis:
Comparator
s darf null sein-sicher; die JavaDoc explizit so sagt: "im Gegensatz zuComparable
, ein Komparator kann Optional erlauben den Vergleich von null-Argumente, während gleichzeitig die Anforderungen für eine aquivalenzrelation."Ok, ich werde entfernen Sie die Schmutzige aus dem code
InformationsquelleAutor AlexWien
Entsprechend der Dokumentation:
Wenn Sie also implementieren Sie eine null-sichere Methode, sein Verhalten wird unerwartet sein (aka inconsitent mit der Dokumentation und vermutlich mit dem rest der API).
InformationsquelleAutor kbec