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


92

Come sai, lo java.util.Objectsè

Questa classe è costituita da metodi di utilità statici per operare sugli oggetti.

Uno di questi metodi è Objects.isNull() .

La mia comprensione è questo Objects.isNull() eliminerebbe la possibilità di assegnare accidentalmente un valore nullo all'oggetto omettendo il secondo =.

Tuttavia, la nota API afferma:

Questo metodo esiste per essere utilizzato come predicato, filtro (Oggetti :: isNull)

Ci sarebbe una ragione / circostanza per cui dovrei usare object == nullpiù Objects.isNull()di un file if ?

Dovrebbe Objects.isNull()essere limitato esclusivamente ai predicati?


4
Se tutto ciò di cui ti preoccupi è un incarico accidentale, puoi semplicemente usarlo in modo if(null == variable)coerente ...
Holger,

1
@ Holder, di che incarico accidentale devi preoccuparti? Questo è Java. Riceverai un errore di tipo.
Louis Wasserman,

1
@LouisWasserman Non se variableè un Boolean.
Alexis C.

2
@AlexisC, questo sarebbe un problema in un numero esiguo di casi: la tua variabile deve essere un tipo molto specifico e devi fare un errore di battitura molto specifico e non puoi usare alcun IDE o analisi del compilatore questo lo farebbe notare per te (come farebbero quasi tutti gli IDE). Sono abbastanza a mio agio a non preoccuparmi di quel caso.
Louis Wasserman

1
Al lavoro, ho visto molte istanze di null == object . Quando ho chiesto informazioni, mi è stato detto che era per evitare assegnazioni nulli accidentali. Sulla base dei commenti e delle risposte qui fornite, sarei propenso a credere che sia una questione di gusto.
Lucas T

Risposte:


82

dovrebbe usare object == null su Objects.isNull () in un'istruzione if?

Se guardi il codice sorgente del IsNullmetodo,

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

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

È lo stesso. Non c'è differenza. Quindi puoi usarlo in sicurezza.


14
Sì, può essere utilizzato, ma può interferire con l'analisi del flusso locale eseguita da uno strumento. Cioè, con un semplice "==", qualsiasi analisi di flusso può vedere che la dereferenziazione non è buona nel ramo then, ma sicuro in un altro ramo. Riceverai errori / avvisi appropriati o niente. Con l'indirizzamento indiretto della chiamata a isNull (), tale conoscenza potrebbe essere persa per lo strumento.
Stephan Herrmann

3
C'è una leggera differenza di prestazioni. Java che verifica il riferimento nullo all'oggetto rispetto alla chiamata di un metodo statico avrà una differenza. E si legge leggermente meno chiaramente del semplice utilizzo di == a cui siamo tutti abituati.
Kevin M,

3
È più semantico == nullin if, ma isNull è ottimo da usare sulle espressioni lambda.
Leonardo Ramos Duarte

1
è sicuramente legittimo, ma non ha alcun vantaggio sugli operatori. Quindi, se lavori in un team, usa le cose secondo lo scopo previsto.
Alex Panchenko

78

Objects.isNull è inteso per l'uso all'interno del filtro lambda Java 8.

È molto più facile e chiaro scrivere:

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

che scrivere:

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

All'interno di una ifdichiarazione, tuttavia, funzioneranno entrambi. L'uso di == nullè probabilmente più facile da leggere ma alla fine si riduce a una preferenza di stile.


12

Guarda la fonte:

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

Per verificare i nullvalori, puoi utilizzare:

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

Il fatto che Objects.isNullsia pensato per Predicates non ti impedisce di usarlo come sopra.


1
Cosa intendi per rischio di errore di battitura?
Ashish Lohia

2
@AshishLohia usando =invece di ==(non compilerebbe a meno che non sia un Booleanwrapper nullable , sii onesto)
Mena

5
Il rischio di errore di battitura è il problema in C ++ non in Java se (myObject = null) si tradurrà in un errore di compilazione. Dovresti sempre usare myObject == null su null == myObject.
Tomas Marik

1
@TomasMarik come menzionato nel mio commento, il rischio di errore di battitura è limitato ai Booleanwrapper nullable in Java. Questo è davvero piuttosto raro (e darà avvertimenti al compilatore quando un'assegnazione a nullviene controllata come se fosse una condizione), ma non impossibile.
Mena

7

Ci sarebbe una ragione / circostanza per cui dovrei usare object == null su Objects.isNull () in un'istruzione if ?

Sì, uno dei motivi è mantenere il codice semplice. Entro if object == null è chiara e ben nota. Non può portare a comportamenti scorretti se ad esempio c'è un errore di battitura.

La mia comprensione è che Objects.isNull () eliminerebbe la possibilità di assegnare accidentalmente un valore nullo all'oggetto omettendo il secondo =.

Se è presente un if (object = null) {}con omesso = non verrà compilato o genererà un avviso in caso di Booleanoggetto! In realtà non v'è alcun motivo per utilizzare Objects.isNull(object)nel corso object == nullall'interno di if . Ecco le due varianti affiancate:

if (object == null) {
}

if (Objects.isNull(object)) {
}

Objects.isNull () dovrebbe essere limitato esclusivamente a Predicates?

Si potrebbe dire di sì, è limitato esclusivamente ai Predicati, sebbene non ci siano ostacoli tecnici per utilizzare il Objects.isNull() ovunque.

Dal public static boolean isNull(Object obj)javadoc del metodo:

@apiNote Questo metodo esiste per essere utilizzato come java.util.function.Predicate, filter (Objects :: isNull)

Quindi, se usi il metodo come non predicato, stai effettivamente usando un'espressione più complessa e ingombrante rispetto al sempliceobject == null .

Ecco uno snippet per confrontare i vantaggi di 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();

2

Semanticamente non c'è differenza ma per leggibilità preferisco quanto segue rispetto a whatever == null:

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.