private val repositories = mutableListOf<String>()
private val repositories = ArrayList<String>()
Ambos son una lista mutable, entonces, ¿cuál es el punto de dos palabras clave mutableListOf
o ArrayList
?
o hay alguna diferencia importante?
Respuestas:
La única diferencia entre los dos es comunicar su intención.
Cuando escribe val a = mutableListOf()
, está diciendo "Quiero una lista mutable y no me importa particularmente la implementación". Cuando escribe, en cambio, val a = ArrayList()
está diciendo "específicamente quiero un ArrayList
".
En la práctica, en la implementación actual de la compilación de Kotlin en la JVM, la llamada mutableListOf
producirá un ArrayList
, y no hay diferencia en el comportamiento: una vez que se crea la lista, todo se comportará igual.
Ahora, digamos que una versión futura de Kotlin cambia mutableListOf
para devolver un tipo diferente de lista.
Es más probable que no, el equipo de Kotlin solo haría ese cambio si se da cuenta de que la nueva implementación funciona mejor para la mayoría de los casos de uso. mutableListOf
entonces tendría que usar esa nueva implementación de lista de manera transparente, y obtendría ese mejor comportamiento de forma gratuita. Vaya mutableListOf
si ese suena como su caso.
Por otro lado, tal vez dedicó mucho tiempo a pensar en su problema y pensó que ArrayList
realmente es la mejor opción para su problema, y no quiere arriesgarse a que lo muevan a algo que no sea óptimo. Entonces probablemente desee usar ArrayList
directamente o usar la arrayListOf
función de fábrica (un ArrayList
análogo específico de mutableListOf
).
mutableListOf<T>()
es una invocación de función en línea que devuelve un
MutableList<T>
. A partir de hoy, mutableListOf
devuelve una instancia de ArrayList
.
ArrayList<String>()
es una invocación de constructor y no se puede insertar.
En otras palabras, dado:
val a = mutableListOf<String>()
val b = ArrayList<String>()
a
es de tipo MutableList<String>
b
es de tipo ArrayList<String>
En tiempo de ejecución, ambos a
y b
mantendrán una instancia de ArrayList
.
Nota que inlining es particularmente útil cuando se combina con el tipo cosificación , lo que justifica la existencia de listOf
, mutableListOf
y similares.
a
y b
tienen un tipo declarado diferente, por lo que hay una diferencia en el momento de la compilación.
val b = arrayListOf<String>()
Como puede ver en las fuentes :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Entonces, no hay diferencia, solo un método de conveniencia.
mutableListOf
tampocoArrayList
palabras clave en Kotlin