2016-06-22 18 views
19

Come sapete, java.util.Objects èjava.util.Objects.isNull vs oggetto == null

a metodi di utilità per operare su oggetti

Uno di questi metodi è Objects.isNull() .

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

Tuttavia, le API nota precisa:

Questo metodo esiste per essere usato come un predicato, filtro (Oggetti :: isnull)

ci sarebbe alcuna ragione/circostanza per la quale mi dovrebbe utilizzare oggetto == null su Objects.isNull() in una se la dichiarazione?

Gli oggetti.isNull() devono essere limitati esclusivamente ai predicati?

Grazie in anticipo, Lucas

+0

c'è anche Objects.requireNonNull (T obj); btw –

+1

Se tutto ciò che ti preoccupa è l'assegnazione accidentale, puoi semplicemente usare 'if (null == variable)' coerentemente ... – Holger

+1

@Holder, quale compito accidentale c'è da preoccuparsi? Questo è Java. Riceverai un errore di tipo. –

risposta

18

dovrebbero usare oggetto == null sopra Objects.isNull() in un'istruzione if?

Se si guarda alla source code di IsNull metodo,

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

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

E 'lo stesso. Non c'è differenza. Quindi puoi usarlo tranquillamente.

+1

Sì, può essere utilizzato, ma può interferire con l'analisi del flusso locale eseguita da uno strumento. Cioè, con un semplice "==", qualsiasi analisi del flusso può vedere che la deviazione non è buona nel ramo allora, ma al sicuro in un altro ramo. Otterrai errori/avvisi appropriati o nulla. Con l'indirezione di chiamata isNull() tale conoscenza può essere persa per lo strumento. –

9

guardare il sorgente:

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

Per controllare per null valori, è possibile utilizzare:

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

Il fatto che Objects.isNull sia inteso per Predicate s non impedisce di utilizzarlo come sopra.

+1

Cosa intendi per rischio di errore di battitura? –

+1

@AshishLohia usando '=' invece di '==' (non verrebbe compilato a meno che non si tratti di un wrapper 'booleano' nullable, sii equo) – Mena

+0

Grazie per averlo chiarito. –

1

Ci sarebbe qualche ragione/circostanza per la quale dovrei usare oggetto == null sopra Objects.isNull() in una if?

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

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

Se c'è un if (object = null) {} con omesso= non si compila o si genererà avviso in caso di Boolean oggetto! In realtà non vi è alcun motivo per utilizzare Objects.isNull(object) su object == null entro se la dichiarazione. Ecco lato due varianti all'altro:

if (object == null) { 
} 

if (Objects.isNull(object)) { 
} 

Qualora Objects.isNull() essere limitato esclusivamente predicati?

Si potrebbe dire di sì, si limita a predicati in esclusiva, anche se non v'è alcun ostacolo tecnico di utilizzare il Objects.isNull() ovunque.

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

metodo @apiNoteThis esiste per essere utilizzato come java.util.function.Predicate, filtro (Oggetti :: isNull)

Quindi, se si utilizza il metodo come non un predicato in realtà si sta utilizzando un'espressione più complessa e ingombrante rispetto al semplice object == null.

Ecco un frammento per confrontare il beneficio 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(); 
4

Objects.isNull è destinato ad essere utilizzato entro Java 8 filtraggio lambda.

È molto più semplice e più chiaro scrivere

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

che scrivere

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

Nel giro di se invece sia funzionerà, l'uso di == null è probabilmente più facile da leggere, ma nel fine si ridurrà a una preferenza di stile.