private val repositories = mutableListOf<String>()
private val repositories = ArrayList<String>()
Entrambi sono elenchi mutabili, allora qual è il punto di due parole chiave mutableListOfo ArrayList?
o c'è qualche differenza importante?
Risposte:
L'unica differenza tra i due è comunicare il tuo intento.
Quando scrivi val a = mutableListOf(), stai dicendo "Voglio un elenco modificabile e non mi interessa particolarmente l'implementazione". Quando scrivi, invece, val a = ArrayList()dici "Ne voglio espressamente uno ArrayList".
In pratica, nell'attuale implementazione della compilazione di Kotlin nella JVM, la chiamata mutableListOfprodurrà un ArrayList, e non c'è alcuna differenza di comportamento: una volta che l'elenco è stato costruito, tutto si comporterà allo stesso modo.
Supponiamo ora che una versione futura di Kotlin cambi mutableListOfper restituire un diverso tipo di elenco.
Più probabile che no, il team di Kotlin apporterebbe quel cambiamento solo se ritenessero che la nuova implementazione funzioni meglio per la maggior parte dei casi d'uso. mutableListOfvorrebbe quindi utilizzare la nuova implementazione dell'elenco in modo trasparente e ottenere quel comportamento migliore gratuitamente. Vai con mutableListOfse suona come il tuo caso.
D'altra parte, forse hai passato un sacco di tempo a pensare al tuo problema e hai capito che è ArrayList davvero la soluzione migliore per il tuo problema e non vuoi rischiare di essere spostato su qualcosa di non ottimale. Quindi probabilmente vorrai usare ArrayListdirettamente o usare la arrayListOffunzione factory (un ArrayListanalogo specifico di mutableListOf).
mutableListOf<T>()è una chiamata di funzione inline che restituisce un file
MutableList<T>. Ad oggi, mutableListOfrestituisce un'istanza di ArrayList.
ArrayList<String>() è una chiamata di un costruttore e non può essere inline.
In altre parole, dato:
val a = mutableListOf<String>()
val b = ArrayList<String>()
a è di tipo MutableList<String>b è di tipo ArrayList<String>In fase di esecuzione, sia ae bmanterranno un'istanza di ArrayList.
Notare che inlining è particolarmente utile quando combinato con tipo reificazione , che giustifica l'esistenza listOf, mutableListOfe simili.
ae bhanno un tipo dichiarato diverso, quindi c'è una differenza in fase di compilazione.
val b = arrayListOf<String>()
Come puoi vedere nelle fonti :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Quindi, non c'è differenza, solo un metodo conveniente.
mutableListOf, néArrayListsono le parole chiave a Kotlin