2015-02-25 6 views
5

Mi chiedevo se c'è un modo semplice (una sola riga, senza creare una funzione) per convertire String-Boolean in Java, ma in un modo che è Booleannull se String è null.Come convertire String in Boolean in Java, ma per trattare null diversamente da false?

Se lo vedo correttamente, tutti i metodi della classe Boolean restituiscono false se la stringa di input è null. Perché?

Perché è meglio che Boolean.valueOf(String s) rendimenti false nel caso di s essere null, invece di restituire null?

+3

'Optional.ofNullable (s) .map (Boolean :: valueOf).orElse (null) 'è un'alternativa. Utile principalmente se il tuo valore è già incluso in un Opzionale. –

risposta

5

Perché è meglio che Boolean.valueOf(String s) rendimenti false nel caso di s essere null, invece di restituire null?

È una questione di opinione e (per essere sinceri) inutile chiedere ... a meno che non si stia progettando la propria lingua e le librerie di runtime. La decisione di progettazione è stata presa più di 20 anni fa e non vi è alcuna possibilità che venga modificata mentre il linguaggio è chiamato "Java".

I javadocs per Boolean.valueOf(String) non offrono alcun indizio sul motivo per cui i progettisti l'hanno progettato in questo modo.

Tuttavia, è chiaro che il comportamento di Boolean.valueOf(String) è incoerente al comportamento di valueOf(String) per le altre classi involucro primitive. Ad esempio Integer.valueOf(String) genera NumberFormatException se l'argomento stringa è null. Quindi è possibile che la vera spiegazione sia che la semantica Boolean.valueOf(String) è solo un'anomalia sfortunata che è il risultato di una svista che si è verificata nella fretta di rilasciare Java 1.0.

Tuttavia, questa è la speculazione. Per una risposta reale è necessario consultare le fonti documentarie Sun/Oracle interne pertinenti (se ancora esistenti) e/o parlare con qualcuno del team Java originale.

+0

Ho una speculazione preferita per questo: 'Boolean.getBoolean', quell'apice della perversione dell'API che risale chiaramente alla prima versione di Java, in realtà ha buone ragioni per restituire' false' per una proprietà di sistema mancante. Naturalmente, si basa internamente sull'API di 'Boolean.parseBoolean' .. –

2

È possibile utilizzare l'operatore ternario:

String s = ... 
Boolean b = s != null ? Boolean.valueOf(s) : null; 
+1

E poi, l'ultima parte della domanda, perché è la funzionalità effettiva di 'Boolean.valueOf()' migliore di se restituita nulla? – vikingsteve

7

Perché è meglio che Boolean.valueOf(String s) rendimenti false nel caso di s essere null, invece di restituire null?

Perché il build-in funzione in Java, chiamato autoboxing.

Supponiamo che Boolean.valueOf(String s)stato realtà tornando null, quando s è null. Quindi, la seguente dichiarazione sarebbe gettando NullPointerException, perché null non può essere assegnato ad una primitiva:

boolean b = Boolean.valueOf(null); 
+2

Bel punto. Ma perché 'Integer.parseInt (null)' lancia 'NumberFormatException (null)' - non si applica anche la funzione di autoboxing? – vikingsteve

+0

@vikingsteve dove si trova l'auto-boxing in questo caso? –

+1

@vikingsteve: Si potrebbe sostenere che una stringa null rappresenta un valore falso per la maggior parte degli usi. Ma quale numero intero dovrebbe rappresentare una stringa nulla? Inoltre, come Peter ha correttamente sottolineato, Integer.parseInt restituisce già un int, non un intero. – llogiq