java.util.Objects.isNull vs object == null

87

Wie Sie wissen, java.util.Objectsist

Diese Klasse besteht aus statischen Dienstprogrammmethoden für die Bearbeitung von Objekten.

Eine dieser Methoden ist Objects.isNull().

Meines Wissens nach Objects.isNull()würde dies die Möglichkeit beseitigen, dem Objekt versehentlich einen Nullwert zuzuweisen, indem der zweite weggelassen wird =.

In der API-Anmerkung heißt es jedoch:

Diese Methode kann als Prädikatfilter verwendet werden (Objects :: isNull).

Gäbe es einen Grund / Umstand , für die ich verwenden soll object == nullüber Objects.isNull()in einer if - Anweisung ?

Sollte Objects.isNull()sich ausschließlich auf Prädikate beschränken?

Lucas T.
quelle
3
Wenn alles, was Sie sich Sorgen machen, eine versehentliche Zuordnung ist, können Sie einfach if(null == variable)konsequent verwenden ...
Holger
1
@Holder, über welche versehentliche Zuordnung muss man sich Sorgen machen? Das ist Java. Sie erhalten einen Tippfehler.
Louis Wasserman
1
@ LouisWasserman Nicht wenn variableist ein Boolean.
Alexis C.
2
@AlexisC, das wäre in einer winzigen Anzahl von Fällen ein Problem : Ihre Variable muss ein sehr spezifischer Typ sein, und Sie müssen einen sehr spezifischen Tippfehler machen, und Sie können keine IDE- oder Compiler-Analyse verwenden das würde Sie darauf hinweisen (wie fast alle IDEs). Ich fühle mich sehr wohl, wenn ich mir keine Sorgen um diesen Fall mache.
Louis Wasserman
1
Bei der Arbeit habe ich viele Instanzen von null == Objekt gesehen . Als ich mich erkundigte, wurde mir gesagt, dass dies versehentliche Nullzuweisungen verhindern soll. Aufgrund der hier gegebenen Kommentare und Antworten würde ich gerne glauben, dass es sich um eine Geschmackssache handelt.
Lucas T

Antworten:

79

sollte object == null über Objects.isNull () in einer if-Anweisung verwendet werden?

Wenn Sie sich den Quellcode der IsNullMethode ansehen ,

 /* Returns true if the provided reference is null otherwise returns false.*/

 public static boolean isNull(Object obj) {
     return obj == null;
 }

Es ist das Gleiche. Es gibt keinen Unterschied. So können Sie es sicher verwenden.

Suresh Atta
quelle
14
Ja, es kann verwendet werden, aber es kann die lokale Flussanalyse beeinträchtigen, die von einem Werkzeug durchgeführt wird. Das heißt, mit einem einfachen "==" kann jede Flussanalyse erkennen, dass die Dereferenzierung im damaligen Zweig nicht gut, aber in einem anderen Zweig sicher ist. Sie erhalten entsprechende Fehler / Warnungen oder nichts. Mit der Indirektion des Aufrufs von isNull () kann dieses Wissen für das Tool verloren gehen.
Stephan Herrmann
3
Es gibt einen leichten Leistungsunterschied. Die Java-Überprüfung auf Objektnullreferenz im Vergleich zum Aufrufen einer statischen Methode hat einen Unterschied. Und es liest sich etwas weniger deutlich als nur mit ==, wie wir es alle gewohnt sind.
Kevin M
3
Ist mehr semantische Verwendung == nullin if, aber isNull ist großartig für Lambda-Ausdrücke.
Leonardo Ramos Duarte
1
Es ist sicherlich legitim, hat aber keine Vorteile gegenüber den Betreibern. Wenn Sie also in einem Team arbeiten, verwenden Sie die Dinge bitte entsprechend ihrem beabsichtigten Zweck.
Alex Panchenko
74

Objects.isNull ist für die Verwendung innerhalb der Java 8-Lambda-Filterung vorgesehen.

Es ist viel einfacher und klarer zu schreiben:

.stream().filter(Objects::isNull) 

als zu schreiben:

.stream().filter(x -> x == null).  

Innerhalb einer ifAnweisung funktioniert jedoch beides. Die Verwendung von == nullist wahrscheinlich einfacher zu lesen, aber am Ende wird es auf eine Stilpräferenz hinauslaufen.

Craig Taylor
quelle
12

Schauen Sie sich die Quelle an:

public static boolean isNull(Object obj) {
    return obj == null;
}

Um nach nullWerten zu suchen, können Sie Folgendes verwenden:

  • Objects.isNull(myObject)
  • null == myObject // avoids assigning by typo
  • myObject == null // risk of typo

Die Tatsache, Objects.isNulldass für Predicates gedacht ist, hindert Sie nicht daran, es wie oben zu verwenden.

Mena
quelle
1
Was meinst du mit Tippfehlerrisiko?
Ashish Lohia
2
@AshishLohia mit =anstelle von ==(würde nicht kompilieren, es sei denn, es ist ein nullbarer BooleanWrapper, yo fair sein)
Mena
5
Das Risiko eines Tippfehlers ist das Problem in C ++, nicht in Java, wenn (myObject = null) zum Kompilierungsfehler führt. Sie sollten immer myObject == null über null == myObject verwenden.
Tomas Marik
1
@TomasMarik Wie in meinem Kommentar erwähnt, ist das Risiko von Tippfehlern auf nullfähige BooleanWrapper in Java beschränkt. Dies ist in der Tat ziemlich selten (und gibt Compiler-Warnungen aus, wenn eine Zuweisung an nullüberprüft wird, als ob es eine Bedingung wäre), aber nicht unmöglich.
Mena
7

Gibt es einen Grund / Umstand, aus dem ich object == null über Objects.isNull () in einer if-Anweisung verwenden sollte ?

Ja, ein Grund ist, den Code einfach zu halten. Innerhalb der if-Aussage object == null ist klar und bekannt. Es kann nicht zu Fehlverhalten führen, wenn beispielsweise ein Tippfehler vorliegt.

Nach meinem Verständnis würde Objects.isNull () die Möglichkeit beseitigen, dem Objekt versehentlich einen Nullwert zuzuweisen, indem das zweite = weggelassen wird.

Wenn ein if (object = null) {}mit weggelassen wird = , wird es nicht kompiliert oder es wird eine Warnung im Falle eines BooleanObjekts generiert ! Eigentlich gibt es keinen Grund zu verwenden , Objects.isNull(object)über object == nullinnerhalb if - Anweisung . Hier sind die beiden Varianten nebeneinander:

if (object == null) {
}

if (Objects.isNull(object)) {
}

Sollte Objects.isNull () ausschließlich auf Prädikate beschränkt sein?

Man könnte sagen, ja, es ist ausschließlich auf Prädikate beschränkt, obwohl es keine technische Hürde gibt, das Objects.isNull()überall zu nutzen .

Aus dem public static boolean isNull(Object obj)Javadoc der Methode:

@apiNoteDiese Methode kann als java.util.function.Predicate-Filter (Objects :: isNull) verwendet werden.

Wenn Sie die Methode also nicht als Prädikat verwenden, verwenden Sie tatsächlich einen komplexeren und umständlicheren Ausdruck als den einfachen object == null.

Hier ist ein Ausschnitt, um den Nutzen von zu vergleichen Objects.isNull(object)

List<String> list = Arrays.asList("a", "b", null, "c", null);

// As ready-made predicate
long countNullsWithPredicate = list.stream().filter(Objects::isNull).count();

// Lambda
long countNullsWithLambda = list.stream().filter(object -> object == null).count();

// Reimplement the Objects::isNull predicate
long countNullsWithAnonymous = list.stream().filter(new Predicate<Object>() {
    @Override
    public boolean test(Object obj) {
        return obj == null;
    }
}).count();
Vasil
quelle
1

Semantisch gibt es keinen Unterschied, aber aus Gründen der Lesbarkeit bevorzuge ich Folgendes whatever == null:

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}
wütend_snyder
quelle