Ich habe von jemandem null == object
gehört, der besser ist als zu object == null
überprüfen
z.B :
void m1(Object obj ) {
if(null == obj) // Is this better than object == null ? Why ?
return ;
// Else blah blah
}
Gibt es Gründe oder ist dies ein anderer Mythos? Danke für die Hilfe.
null
Referenzen sollte die Standardmaßnahme darin bestehen, eine NPE zu werfen. Einige nette Bibliotheken (wie die JDK7-Java-Bibliothek) haben eine Methode wiepublic static <T> T notNull(T obj) { if (obj == null) { throw new NullPointerException(); } else { return obj; } }
. Es gibt auch@NonNull
(oder@Nonnull
?), Aber das wird "gelöscht".null == object
ist als Yoda-Zustand bekannt .Antworten:
Dies ist wahrscheinlich eine Gewohnheit, die von C gelernt wurde, um diese Art von Tippfehler zu vermeiden (einfach
=
statt doppelt==
):Die Konvention, die Konstante auf die linke Seite von zu setzen,
==
ist in Java nicht wirklich nützlich, da Java erfordert, dass der Ausdruck in einerif
Auswertung einenboolean
Wert ergibt. Wenn die Konstante also nicht a istboolean
, wird in beiden Fällen ein Kompilierungsfehler angezeigt Argumente. (und wenn es ein Boolescher Wert ist, sollten Sie ihn==
sowieso nicht verwenden ...)quelle
x.booleanValue()
oder verwenden!x.booleanValue()
.x == true
oderx == false
in einem Zustand Ausdruck ist ein schlechter Geruch, IMHO.null == object
nur um sicherzustellen, dass wir Objekte nicht versehentlich mit einem Tippfehler überschreiben, sollte überhaupt kein Anwendungsfall sein. Das heißt, wir trainieren uns selbst, dass es jetzt, wo ich zuerst "null" benutze, in Ordnung ist, auch wenn ich einen Fehler mache. Das bedeutet nicht, dass der Code wie erwartet funktioniert. Selbst wennnull = object
anstelle von angegebennull == object
, wird das Programm nicht wie erwartet funktionieren! Dann macht es keinen Sinn, dieser Konvention zu folgen!Wie andere gesagt haben, ist es eine Gewohnheit von C, Tippfehler zu vermeiden - obwohl ich selbst in C anständige Compiler mit ausreichend hohen Warnstufen erwarten würde, um eine Warnung zu geben. Wie Chandru sagt, würde ein Vergleich mit null auf Java auf diese Weise nur dann Probleme verursachen, wenn Sie eine Variable vom Typ verwenden
Boolean
(die nicht im Beispielcode enthalten ist). Ich würde sagen, das ist eine ziemlich seltene Situation und keine, für die es sich lohnt, die Art und Weise zu ändern, wie Sie überall Code schreiben. (Ich würde mich auch in diesem Fall nicht darum kümmern, die Operanden umzukehren. Wenn ich klar genug denke, um sie umzukehren, kann ich sicher die Gleichheitszeichen zählen.)Was nicht erwähnt wurde, ist, dass viele Leute (ich selbst sicherlich eingeschlossen) das
if (variable == constant)
Formular besser lesbar finden - es ist eine natürlichere Art, sich auszudrücken. Dies ist ein Grund , eine Konvention nicht blind aus C zu kopieren. Sie sollten Praktiken immer in Frage stellen (wie Sie es hier tun :), bevor Sie davon ausgehen, dass das, was in einer Umgebung nützlich sein kann, in einer anderen nützlich ist.quelle
Dies ist in Java (1.5+) nur dann von großem Wert, wenn der Objekttyp ist
Boolean
. In diesem Fall kann dies immer noch nützlich sein.if (object = null)
verursacht in Java 1.5+ keinen Kompilierungsfehler, wenn das Objekt ein istBoolean
, würde aberNullPointerException
zur Laufzeit ein auslösen .quelle
In Java gibt es keinen guten Grund.
Ein paar andere Antworten haben behauptet, dass es daran liegt, dass Sie versehentlich eine Zuordnung anstelle von Gleichheit vornehmen können. Aber in Java muss ein Boolescher Wert in einem if enthalten sein.
wird nicht kompiliert.
In Java kann dies nur dann von Bedeutung sein, wenn die Variable boolesch ist:
quelle
== true
oder gleich== true == true
.== true
. Aber ich habe in meiner Karriere so viel schlechten Code gesehen, dass ich nicht mehr frage, warum jemand etwas schreiben würde und einfach akzeptiere, dass einige Leute unnötigen / fragwürdigen Code geschrieben haben.x == true
als schlecht ansieht, weil er fälschlicherweise so geschrieben werden könntex = true
, dass es nicht viel Sinn macht, ihn intrue == x
statt nur zu ändernx
.Dies hängt auch eng zusammen mit:
Das ist praktisch, wenn Sie sich nicht mit NPEs befassen möchten:
quelle
int
es sich um einen primitiven Typ handelt , ist relevant, da es unmöglich ist, sichequals
auf einen zu berufenint
. Daher macht es keinen Sinn, darüber zu diskutieren, obx.equals(constant)
oderconstant.equals(x)
fürint
Werte. Und fürInteger
Werte ist der Standardwertnull
eher als0
.Dieser Trick soll verhindern
v = null
Tippfehler verhindern.Java erlaubt aber nur boolesche Ausdrücke als
if()
Bedingungen, so dass ein Trick nicht viel Sinn macht. Der Compiler findet diese Tippfehler trotzdem.Es ist jedoch immer noch ein wertvoller Trick für C / C ++ - Code.
quelle
Aus dem gleichen Grund machst du es in C; Zuweisung ist ein Ausdruck, daher setzen Sie das Literal links, damit Sie es nicht überschreiben können, wenn Sie es versehentlich
=
anstelle von verwenden==
.quelle
x
gleich ist5
, wenn Sie versehentlich tippenif (x = 5)
, es leise kompiliert wird (und immer auswertettrue
, unabhängig vom Wert vonx
). Wenn Sie es sich jedoch zur Gewohnheit machen, immer zuerst das Literal anzugeben: 'if (5 = x)', kann der Compiler Ihre Arbeit überprüfen und Ihnen im Debugger Zeit sparen. Moderne Compiler machen diese Gewohnheit unnötig.obj
es vom Typjava.lang.Boolean
(großes B) wäre (ich denke, nicht wirklich ausprobiert oder so).Das ist für Leute, die es vorziehen, die Konstante auf der linken Seite zu haben. In den meisten Fällen verhindert die Konstante auf der linken Seite, dass die NullPointerException ausgelöst wird (oder dass ein anderer Nullcheck ausgeführt wird). Zum Beispiel führt die String-Methode gleich auch eine Nullprüfung durch. Wenn Sie die Konstante links haben, können Sie den zusätzlichen Scheck nicht ausstellen. Was auf andere Weise auch später durchgeführt wird. Der Nullwert links ist nur konsistent.
mögen:
quelle
Es ist eine Yoda-Bedingung, die auf unterschiedliche Weise schreibt
In Java
Yoda Zustand
quelle
Vergleichen Sie mit folgendem Code:
Ausgabe (nach mehreren Ausführungen):
Daher
pingResult != null
ist der Gewinner.quelle
Aufgrund seiner kommutativen Eigenschaft ist der einzige Unterschied zwischen
object == null
undnull == object
(der Yoda-Version ) kognitiver Natur : wie der Code vom Leser gelesen und verdaut wird. Ich kenne die endgültige Antwort zwar nicht, aber ich weiß, dass ich es persönlich vorziehe , das Objekt, das ich inspiziere, mit etwas anderem zu vergleichen, anstatt etwas anderes mit dem Objekt zu vergleichen, das ich inspiziere , wenn dies Sinn macht. Beginnen Sie mit dem Thema und dann mit dem Wert, mit dem Sie es vergleichen möchten.In einigen anderen Sprachen ist dieser Vergleichsstil nützlicher.
Um sich vor einem fehlenden "=" - Zeichen im Allgemeinen zu schützen, halte ich das Schreiben
null == object
für einen fehlgeleiteten Akt der defensiven Programmierung . Der bessere Weg, um diesen bestimmten Code zu umgehen, besteht darin, das Verhalten mit einem Junit-Test zu garantieren. Denken Sie daran, dass der mögliche Fehler, ein "=" zu verpassen, nicht von den Eingabeargumenten der Methode abhängt - Sie sind nicht von der richtigen Verwendung dieser API durch andere Personen abhängig -, sodass ein Junit-Test perfekt ist, um sich stattdessen davor zu schützen. Auf jeden Fall sollten Sie Junit-Tests schreiben, um das Verhalten zu überprüfen. Ein fehlendes "=" fällt natürlich in den Geltungsbereich.quelle