private val repositories = mutableListOf<String>()
private val repositories = ArrayList<String>()
Ambos são lista mutável, então qual é o sentido de duas palavras mutableListOf
- chave ou ArrayList
?
ou existe alguma diferença importante?
Respostas:
A única diferença entre os dois é comunicar sua intenção.
Quando você escreve val a = mutableListOf()
, você está dizendo "Eu quero uma lista mutável e não me importo particularmente com a implementação". Ao escrever, em vez disso, val a = ArrayList()
você está dizendo "Eu quero especificamente um ArrayList
".
Na prática, na implementação atual de compilação do Kotlin para a JVM, a chamada mutableListOf
produzirá um ArrayList
, e não há diferença no comportamento: uma vez que a lista é construída, tudo se comportará da mesma forma.
Agora, digamos que uma versão futura do Kotlin seja alterada mutableListOf
para retornar um tipo diferente de lista.
Mais provável do que não, a equipe Kotlin só faria essa mudança se descobrir que a nova implementação funciona melhor para a maioria dos casos de uso. mutableListOf
então, você usaria essa nova implementação de lista de forma transparente e obteria esse comportamento melhor gratuitamente. Vá em frente, mutableListOf
se for esse o seu caso.
Por outro lado, talvez você tenha passado muito tempo pensando sobre seu problema e percebido que ArrayList
realmente é a melhor opção para ele e não quer correr o risco de ser movido para algo abaixo do ideal. Então você provavelmente deseja usar ArrayList
diretamente ou usar a arrayListOf
função de fábrica (um ArrayList
análogo específico para mutableListOf
).
mutableListOf<T>()
é uma invocação de função embutida que retorna um
MutableList<T>
. A partir de hoje, mutableListOf
retorna uma instância de ArrayList
.
ArrayList<String>()
é uma invocação do construtor e não pode ser embutida.
Em outras palavras, dado:
val a = mutableListOf<String>()
val b = ArrayList<String>()
a
é do tipo MutableList<String>
b
é do tipo ArrayList<String>
Em tempo de execução, a
e b
manterá uma instância de ArrayList
.
Note-se que inline é particularmente útil quando combinado com o tipo reification , o que justifica a existência de listOf
, mutableListOf
e semelhantes.
a
e b
têm diferentes tipos declarados - portanto, há uma diferença em tempo de compilação.
val b = arrayListOf<String>()
Como você pode ver nas fontes :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Portanto, não há diferença, apenas um método de conveniência.
mutableListOf
nemArrayList
são palavras-chave em Kotlin