private val repositories = mutableListOf<String>()
private val repositories = ArrayList<String>()
Обидва вони є змінним списком, тоді в чому сенс двох ключових слів mutableListOf
чи ArrayList
?
чи є якась велика різниця?
Відповіді:
Єдина різниця між ними полягає в повідомленні про свої наміри.
Коли ви пишете val a = mutableListOf()
, ви говорите: "Я хочу змінити список, і я особливо не дбаю про реалізацію". Коли ви пишете, замість цього, val a = ArrayList()
ви говорите "я спеціально хочу ArrayList
".
На практиці, в поточній реалізації Kotlin, компілюючи до JVM, виклик mutableListOf
видасть ArrayList
, і немає різниці в поведінці: як тільки список буде побудований, все буде поводитися однаково.
Тепер, припустимо, що майбутня версія Kotlin змінюється, mutableListOf
щоб повернути список іншого типу.
Швидше за все, команда Kotlin внесе цю зміну лише в тому випадку, якщо вважатиме, що нова реалізація працює краще для більшості випадків використання. mutableListOf
тоді ви б використовували цей новий внесок списку прозоро, і ви б отримали таку кращу поведінку безкоштовно. Ідіть, mutableListOf
якщо це звучить як ваша справа.
З іншого боку, можливо, ви витратили купу часу, обмірковуючи свою проблему, і зрозуміли, що це ArrayList
дійсно найкраще підходить для вашої проблеми, і ви не хочете ризикувати переходом до чогось неоптимального. Тоді ви, мабуть, хочете або використовувати ArrayList
безпосередньо, або використовувати arrayListOf
заводську функцію (конкретний ArrayList
аналог mutableListOf
).
mutableListOf<T>()
- це вбудований виклик функції, який повертає a
MutableList<T>
. На сьогоднішній день mutableListOf
повертає екземпляр ArrayList
.
ArrayList<String>()
є викликом конструктора і не може бути вбудованим.
Іншими словами, враховуючи:
val a = mutableListOf<String>()
val b = ArrayList<String>()
a
має тип MutableList<String>
b
має тип ArrayList<String>
Під час виконання обидва a
і b
будуть містити екземпляр ArrayList
.
Зверніть увагу, що вбудовування особливо корисно в поєднанні з перетворенням типу , що виправдовує існування listOf
, mutableListOf
тощо.
a
і b
мають різний оголошений тип - тому є різниця під час компіляції.
val b = arrayListOf<String>()
Як ви можете бачити в джерелах :
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Отже, різниці немає, лише зручний метод.
mutableListOf
ніArrayList
ключові слова в Котлин