Considera il seguente blocco di Kotlin.
var nullableInt: Int? = null
if (nullableInt != null) {
val checkedInt: Int = nullableInt
print("not-null-branch")
} else {
print("null-branch")
}
Android Studio mi dice che il cast intelligente da Int?a Intnon è possibile, poiché nullableIntè mutevole. Capisco che questo potrebbe essere un problema nel codice multithread.
Un modo per gestire il problema è fare un cast esplicito con val checkedInt: Int = nullableInt!!, ma se usassi il codice in un ambiente multithread non è consigliabile.
Ci sono un paio di domande molto vicine su SO riguardo a questo argomento. Tuttavia, non trovo una risposta soddisfacente in nessuno di quelli che ho trovato:
In Kotlin, qual è il modo idiomatico di gestire valori nullable, fare riferimento o convertirli discute perché si pone il problema, ma non fornisce suggerimenti su come gestirlo
Kotlin evita lo smart cast per il controllo null ha un ramo if-not-null che restituisce un valore non null, quindi il ?.let{} :? {}costrutto funziona lì. Poiché il mio ramo non nullo restituisce null, verranno eseguiti entrambi i rami.
Kotlin "Smart cast è impossibile, perché la proprietà avrebbe potuto essere cambiata in questo momento" riguarda solo un ramo non nullo e nessun ramo nullo, quindi il ?.let{}costrutto sembra corretto. In quel thread, forniscono il suggerimento di prendere una copia locale prima della ifdichiarazione, il che potrebbe essere fattibile anche nel mio caso. Purtroppo non è molto elegante e spero che ci sia qualche altra alternativa.
Esiste un modo per gestire questa ramificazione condizionale nullo in modo nullo senza prendere una copia?
Capisco che la risposta potenzialmente potrebbe essere "dipende". Se è così, per favore dillo e spiega perché.
.letinvece di?.letPoiché la .letfunzione di estensione è definita per tutti i tipi, inclusi quelli nullable, è possibile chiamarla effettivamente senza l' ?.operatore di chiamata sicura . Quando lo fai, il lambda verrà sempre chiamato, anche per i nullvalori. Il parametro all'interno del letblocco sarà nullable se il ricevitore è nullable.
Tuttavia, il parametro lambda è idoneo per lo smart casting , perché non è modificabile.
Ecco la differenza:
x.let { it -> /* This always runs. 'it' can be null if 'x' is null */ }
x?.let { it -> /* This only runs if 'x' is not null. 'it' is never null. */ }
Applicandolo al tuo esempio, potresti scrivere questo:
var nullableInt: Int? = null
nullableInt.let {
if (it != null) {
doSomethingWith(it)
} else {
doSomethingElse()
}
}
Non è possibile avviare il cast di una proprietà perché un altro thread potrebbe modificarla. Non c'è un modo logico per aggirare questo. La lingua fornisce già un modo non sicuro per farlo con ciò !!che hai già menzionato.
Fare una copia locale del riferimento (manualmente o utilizzando una funzione di ambito come witho let) è banale, quindi non è qualcosa di cui ti devi preoccupare.
La mia opinione personale è che una variabile locale è il modo più pulito e leggibile per farlo. Eviti l'annidamento di blocchi che avresti con le funzioni di ambito.
val myVar = myProp
if (myVar != null) {
} else {
}
Penso che il modo più pulito con le funzioni di ambito sia quello di utilizzare with. Legge meglio di letquando gestisci entrambi i rami.
with(myProp) {
if (this != null) {
} else {
}
}
Per un modo conciso di gestire entrambi i rami, funziona quanto segue. Considero alsoun po 'più robusto rispetto leta questa situazione, perché non puoi eseguire accidentalmente entrambi i rami restituendo un valore nullo dal primo lambda. Ma la leggibilità soffre di andare così conciso.
myProp?.also {
// not null it
} ?: run {
// null
}
Jana Duggar è stata aperta sulla sua ricerca dell'amore. Ecco tutto ciò che ha detto sull'argomento e sulla sua finestra di cinque anni per il matrimonio.
La star di 'Outlander' Sam Heughan ha recentemente rivelato cosa prenderà dal set per ricordare Jamie Fraser, il ruolo che lo ha reso una star.
"She Loves You" è stata scritta in un'ora, registrata in un giorno ed è stata la canzone dei Beatles con una delle loro migliori performance della loro carriera.
Dolly Parton e sua nonna Bessie avevano un rapporto speciale. Nonna Parton era molto malata, ma questo non ha impedito a Dolly di farle uno scherzo.
Si potrebbe pensare che la quercia o il noce americano siano resistenti, ma quando si tratta del legno più duro del mondo, non si avvicinano nemmeno.
L'oceano è pieno di bellezza, ma nasconde anche alcune delle creature marine più spaventose del pianeta. Molti di questi animali si nascondono molto al di sotto della superficie dell'oceano, nel mondo oscuro e ad alta pressione delle profondità marine.
Se stai combattendo contro nemici ostili o ti stai preparando per scenari PvP, conoscere i migliori incantesimi per le spade offerti da Minecraft può darti un vantaggio notevole. Incantare le spade ti permette di infliggere più danni, aumentare il numero di nemici che cadono e aumentare la durata della tua spada.
Quando si parla di paesi socialisti, spesso si immagina un sistema con il pieno controllo del governo e nessuna proprietà privata. Ma nella pratica, le economie socialiste variano notevolmente.
“Children” presenta un cameo di un grande nome e alcune notizie devastanti
Si dice che questo RAV4 sia in condizioni eccellenti ed è pronto per il gioco delle sedie musicali.
Le riprese dei droni hanno ripreso i vigili del fuoco che sembravano lottare per spegnere l'incendio.
Eyes of Wakanda si collega direttamente al MCU, oltre ad aggiornamenti su X-Men '97, What If..., Daredevil e altro ancora.
Ava Gardner avrebbe dovuto sposarsi con Mickey Rooney e Frank Sintra, e frequentare diverse altre star di Hollywood. Ecco uno sguardo alla storia sentimentale di Ava Gardner.
John Cleese ha sposato sua moglie, Jennifer Wade, nel 2012. Ecco tutto quello che c'è da sapere sulla moglie di John Cleese, Jennifer Wade.
Dev Patel ha incontrato la sua ragazza nel 2016 sul set di "Hotel Mumbai". Ecco tutto quello che c'è da sapere su Tilda Cobham-Hervey.
Garth Brooks e Trisha Yearwood sono sposati dal 2005. Ecco una cronologia completa della loro relazione.
Mi colpisce Improvvisamente come spesso accade È di nuovo la via di mezzo <No, non quello nel pacifico tu marrone, quello al carnevale> Ogni titolo a voce alta…..
Nel 2022, con il rilascio di GPT-3, l'abilità di scrittura sembra diventare meno importante. Con l'intelligenza artificiale, anche le persone con una scrittura scadente possono generare personale di qualità.
Nel mondo frenetico e competitivo di oggi, la propria carriera gioca un ruolo significativo nella crescita personale, nella stabilità finanziaria e nella soddisfazione generale della vita. Tuttavia, molte persone si trovano intrappolate in un ciclo inesorabile di stagnazione e insoddisfazione, che si esauriscono gradualmente nella loro vita professionale.
La scorsa settimana ho notato un comunicato stampa, inviato tramite PressGazette (un sito Web di notizie sui media britannici). L'articolo annunciava che Acast, la società di hosting e pubblicità di podcast di Scandi, avrebbe guidato un consorzio di editori "probabilmente i più influenti" nel podcasting.