2016-05-14 19 views
20

Devo usare il doppio = o il triplo =?il modo migliore per il controllo nullo in kotlin?

if(a === null) { 
//do something 
} 

o

if(a == null) { 
//do something 
} 

Allo stesso modo per i 'non è uguale a':

if(a !== null) { 
//do something 
} 

o

if(a != null) { 
//do something 
} 
+0

hanno guardare sul link: - https://kotlinlang.org /docs/reference/null-safety.html ..............È facile con Kotlin Docs – sushildlh

risposta

15

Entrambi gli approcci generare lo stesso bytecode modo da poter scegliere quello che preferite .

+0

Se ho capito bene, allora mi sta chiedendo il modo migliore per controllare null in Kotlin, non quale approccio genera il miglior codice byte. @ BenitoBertoli sembra promettente, riduce il codice boiler – imGs

36

A parità strutturale a == b viene tradotto

a?.equals(b) ?: (b === null) 

Pertanto quando si confrontano al null, l'uguaglianza strutturale a == null è tradotto in un'uguaglianza referenziale a === null.

Secondo il docs, non v'è alcun punto in ottimizzazione del codice, in modo da poter usare a == null e a != null


Nota che se la variabile è una proprietà mutevole, non sarà in grado di intelligente trasmetterlo al suo tipo non annullabile all'interno dell'istruzione if (poiché il valore potrebbe essere stato modificato da un altro thread) e dovresti invece utilizzare l'operatore di chiamata sicura con let.

operatore di call sicuro?.

a?.let { 
    // not null do something 
    println(it) 
    println("not null") 
} 


Si può usare in combinazione con l'operatore di Elvis.

Elvis operatore ?:(sto cercando di indovinare perché il punto interrogativo si presenta come capelli di Elvis')

a ?: println("null") 

E se si desidera eseguire un blocco di codice

a ?: run { 
    println("null") 
    println("The King has left the building") 
} 

Combinazione dei due

a?.let { 
    println("not null") 
    println("Wop-bop-a-loom-a-boom-bam-boom") 
} ?: run { 
    println("null") 
    println("When things go null, don't go with them") 
} 
+0

perché non usi 'se' per assegni nulli? 'a? .let {}?: run {}' è appropriato solo in rari casi, altrimenti non è un idioma – voddan

+0

@voddan Non stavo suggerendo di non usare se per i controlli 'null', stavo elencando altre opzioni valide. Anche se non sono sicuro che 'run' abbia qualche tipo di penalizzazione delle prestazioni. Aggiornerò la mia risposta per renderla più chiara. –

1

Controlla i metodi utili fuori, potrebbe essere utile:

/** 
* Performs [R] when [T] is not null. Block [R] will have context of [T] 
*/ 
inline fun <T : Any, R> ifNotNull(input: T?, callback: (T) -> R): R? { 
    return input?.let(callback) 
} 

/** 
* Checking if [T] is not `null` and if its function completes or satisfies to some condition. 
*/ 
inline fun <T: Any> T?.isNotNullAndSatisfies(check: T.() -> Boolean?): Boolean{ 
    return ifNotNull(this) { it.run(check) } ?: false 
} 

Qui di seguito è possibile esempio come utilizzare queste funzioni:

var s: String? = null 

// ... 

if (s.isNotNullAndSatisfies{ isEmpty() }{ 
    // do something 
} 
Problemi correlati