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ключові слова в Котлин