private val repositories = mutableListOf<String>()
private val repositories = ArrayList<String>()
Les deux sont une liste mutable, alors quel est l'intérêt de deux mots mutableListOf
- clés ou ArrayList
?
ou y a-t-il une différence majeure?
La seule différence entre les deux est de communiquer votre intention.
Lorsque vous écrivez val a = mutableListOf()
, vous dites "Je veux une liste modifiable, et je ne me soucie pas particulièrement de l'implémentation". Lorsque vous écrivez, à la place, val a = ArrayList()
vous dites "Je veux spécifiquement unArrayList
".
En pratique, dans l'implémentation actuelle de la compilation de Kotlin sur la JVM, l'appel mutableListOf
produira un ArrayList
, et il n'y a pas de différence de comportement: une fois la liste construite, tout se comportera de la même manière.
Maintenant, disons qu'une future version de Kotlin change mutableListOf
pour renvoyer un type de liste différent.
Plus probable qu'improbable, l'équipe Kotlin n'apporterait ce changement que si elle estimait que la nouvelle implémentation fonctionnait mieux pour la plupart des cas d'utilisation. mutableListOf
vous obligerait alors à utiliser cette nouvelle implémentation de liste de manière transparente, et vous obtiendriez ce meilleur comportement gratuitement. Allez-y mutableListOf
si cela ressemble à votre cas.
D'un autre côté, peut-être avez-vous passé beaucoup de temps à réfléchir à votre problème, et avez-vous pensé que c'était ArrayList
vraiment la meilleure solution pour votre problème, et vous ne voulez pas risquer d'être déplacé vers quelque chose de sous-optimal. Ensuite, vous voudrez probablement soit utiliser ArrayList
directement, soit utiliser la arrayListOf
fonction d'usine (un ArrayList
analogue spécifique à mutableListOf
).
mutableListOf<T>()
est une invocation de fonction en ligne qui renvoie un
MutableList<T>
. À partir d'aujourd'hui, mutableListOf
renvoie une instance de ArrayList
.
ArrayList<String>()
est un appel de constructeur et ne peut pas être inséré.
En d'autres termes, étant donné:
val a = mutableListOf<String>()
val b = ArrayList<String>()
a
est de type MutableList<String>
b
est de type ArrayList<String>
Au moment de l'exécution, les deux a
et b
contiendront une instance de ArrayList
.
Notez que l'inlining est particulièrement utile lorsqu'il est combiné avec la réification de type , ce qui justifie l'existence de listOf
, mutableListOf
etc.
a
et b
ont un type déclaré différent - il y a donc une différence au moment de la compilation.
val b = arrayListOf<String>()
Comme vous pouvez le voir dans les sources :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Donc, il n'y a pas de différence, juste une méthode pratique.
mutableListOf
neArrayList
sont dans Kotlin