Kotlin non fa nulla implicitamente. Non converte i tipi numerici senza le tue istruzioni specifiche, né imposta un valore di default o di inizializzazione senza che sia esplicito. È una scelta progettuale per eliminare gli errori comuni rilevati nei tipici programmi Java. Non è chiaro al compilatore se hai dimenticato di inizializzarlo o se intendevi usare un valore predefinito. Dal momento che non è chiaro, è male. E quindi risultati probabili in errori.
Le scelte di progettazione di Kotlin aiutano a eliminare i bug dovuti al codice in cui il compilatore non può aiutare a determinare se c'è un errore. È filosofico e coerente nella lingua.
Kotlin richiede l'inizializzazione prima dell'uso. Per i membri che significano che i costruttori e gli inizializzatori del tempo sono completati, devono avere un valore. Il modificatore lateinit
su var
consente di ignorarlo in fase di compilazione anche se in fase di esecuzione il controllo viene eseguito quando si accede alla variabile. Per le variabili locali, qualsiasi ramo di codice deve inizializzare il valore prima dell'accesso. Per esempio:
fun stateFromAbbreviation(abbreviation: String?): String {
val state: String
if (abbreviation == null) {
state = DEFAULT_STATE
}
else {
state = stateMap.get(abbreviation) ?: throw IllegalStateException("Invalid state abbreviation $abbreviation")
}
return state
}
Qui la variabile locale può essere inizializzato nel if
dichiarazione assumendo tutti i rami inizializzare il valore. Ma in realtà, questo codice sarebbe più idiomatica utilizzando il if
come espressione, come ad esempio:
fun stateFromAbbreviation(abbreviation: String?): String {
return if (abbreviation == null) {
DEFAULT_STATE
}
else {
stateMap.get(abbreviation) ?: throw IllegalStateException("Invalid state abbreviation $abbreviation")
}
}
fonte
2015-12-27 02:26:31
"Ma in Kotlin maggior parte dei valori non sono annullabili, quindi non è possibile inizializzare con null" - I ha chiesto specificamente la proprietà dichiarata in questo modo: 'var allBeDefaut: Int?'.Chiaramente, questa è la variabile nullable e potrebbe essere inizializzata con 'null' di default, invece di, ad esempio,' var someVar: Int'. – aga
@aga Ma la coerenza è molto importante. Inoltre, l'inizializzazione predefinita è in qualche modo indiretta/invisibile, ma dovrebbe essere comunque evitata. Quasi tutti i casi d'uso per questo hanno una soluzione più elegante – voddan
E non ho mai visto un buon uso per l'inizializzazione di default, in qualsiasi lingua con cui ho lavorato – voddan