Weder mutableListOfnoch ArrayListsind Schlüsselwörter in Kotlin
Ilya
Antworten:
137
Der einzige Unterschied zwischen den beiden besteht darin, Ihre Absicht mitzuteilen.
Wenn Sie schreiben val a = mutableListOf(), sagen Sie: "Ich möchte eine veränderbare Liste, und die Implementierung ist mir nicht besonders wichtig." Wenn Sie stattdessen schreiben, val a = ArrayList()sagen Sie "Ich möchte speziell eine ArrayList".
In der Praxis führt der Aufruf in der aktuellen Implementierung der Kotlin-Kompilierung in die JVM zu mutableListOfeinem ArrayList, und es gibt keinen Unterschied im Verhalten: Sobald die Liste erstellt ist, verhält sich alles gleich.
Angenommen, eine zukünftige Version von Kotlin ändert sich mutableListOf, um einen anderen Listentyp zurückzugeben.
Wahrscheinlich würde das Kotlin-Team diese Änderung nur vornehmen, wenn es feststellt, dass die neue Implementierung für die meisten Anwendungsfälle besser funktioniert. mutableListOfWenn Sie dann diese neue Listenimplementierung transparent verwenden, erhalten Sie dieses bessere Verhalten kostenlos. Gehen Sie mit, mutableListOfwenn das nach Ihrem Fall klingt.
Auf der anderen Seite haben Sie vielleicht eine Menge Zeit damit verbracht, über Ihr Problem nachzudenken, und festgestellt, dass dies ArrayListwirklich am besten zu Ihrem Problem passt, und Sie möchten nicht riskieren, sich auf etwas Suboptimales zu konzentrieren. Dann möchten Sie wahrscheinlich entweder ArrayListdirekt oder die arrayListOfFactory-Funktion verwenden (ein ArrayListspezifisches Analogon zu mutableListOf).
mutableListOf<T>()ist ein Inline-Funktionsaufruf, der a zurückgibt
MutableList<T>. Gibt ab heute mutableListOfeine Instanz von zurück ArrayList.
ArrayList<String>() ist ein Konstruktoraufruf und kann nicht eingefügt werden.
Mit anderen Worten, gegeben:
val a = mutableListOf<String>()val b =ArrayList<String>()
a ist vom Typ MutableList<String>
b ist vom Typ ArrayList<String>
Zur Laufzeit halten beide aund beine Instanz von ArrayList.
Beachten Sie, dass inlining ist besonders nützlich , wenn sie mit kombinierten Typ Verdinglichung , die die Existenz rechtfertigt listOf, mutableListOfund dergleichen.
Und ich würde "Bequemlichkeit" in Anführungszeichen setzen. Bis MutableList tatsächlich eine andere Implementierung hat, ist die Bereitstellung eines Kernobjekts , das dasselbe wie ein anderes Kernobjekt tut, verwirrend und überhaupt nicht bequem. :(
mutableListOf
nochArrayList
sind Schlüsselwörter in KotlinAntworten:
Der einzige Unterschied zwischen den beiden besteht darin, Ihre Absicht mitzuteilen.
Wenn Sie schreiben
val a = mutableListOf()
, sagen Sie: "Ich möchte eine veränderbare Liste, und die Implementierung ist mir nicht besonders wichtig." Wenn Sie stattdessen schreiben,val a = ArrayList()
sagen Sie "Ich möchte speziell eineArrayList
".In der Praxis führt der Aufruf in der aktuellen Implementierung der Kotlin-Kompilierung in die JVM zu
mutableListOf
einemArrayList
, und es gibt keinen Unterschied im Verhalten: Sobald die Liste erstellt ist, verhält sich alles gleich.Angenommen, eine zukünftige Version von Kotlin ändert sich
mutableListOf
, um einen anderen Listentyp zurückzugeben.Wahrscheinlich würde das Kotlin-Team diese Änderung nur vornehmen, wenn es feststellt, dass die neue Implementierung für die meisten Anwendungsfälle besser funktioniert.
mutableListOf
Wenn Sie dann diese neue Listenimplementierung transparent verwenden, erhalten Sie dieses bessere Verhalten kostenlos. Gehen Sie mit,mutableListOf
wenn das nach Ihrem Fall klingt.Auf der anderen Seite haben Sie vielleicht eine Menge Zeit damit verbracht, über Ihr Problem nachzudenken, und festgestellt, dass dies
ArrayList
wirklich am besten zu Ihrem Problem passt, und Sie möchten nicht riskieren, sich auf etwas Suboptimales zu konzentrieren. Dann möchten Sie wahrscheinlich entwederArrayList
direkt oder diearrayListOf
Factory-Funktion verwenden (einArrayList
spezifisches Analogon zumutableListOf
).quelle
mutableListOf<T>()
ist ein Inline-Funktionsaufruf, der a zurückgibtMutableList<T>
. Gibt ab heutemutableListOf
eine Instanz von zurückArrayList
.ArrayList<String>()
ist ein Konstruktoraufruf und kann nicht eingefügt werden.Mit anderen Worten, gegeben:
a
ist vom TypMutableList<String>
b
ist vom TypArrayList<String>
Zur Laufzeit halten beide
a
undb
eine Instanz vonArrayList
.Beachten Sie, dass inlining ist besonders nützlich , wenn sie mit kombinierten Typ Verdinglichung , die die Existenz rechtfertigt
listOf
,mutableListOf
und dergleichen.quelle
a
undb
haben einen anderen deklarierten Typ - es gibt also einen Unterschied bei der Kompilierung.val b = arrayListOf<String>()
Wie Sie in Quellen sehen können :
Es gibt also keinen Unterschied, nur eine bequeme Methode.
quelle