Использование Kotlin MutableList или ArrayList, где списки необходимы в Android
Я пытаюсь освоить "родной путь Kotlin" для работы в Android, будучи экспертом ни в Kotlin, ни в Java, ни в разработке Android. В частности, когда использовать ArrayList
против MutableList
,
Мне кажется, что MutableList
должен быть выбран по возможности. Тем не менее, если я посмотрю на примеры Android, они, кажется, всегда выбирают ArrayList
(насколько я нашел до сих пор).
Ниже приведен фрагмент рабочего примера, который использует ArrayList
и расширяет Java RecyclerView.Adapter
,
class PersonListAdapter(private val list: ArrayList<Person>,
private val context: Context) : RecyclerView.Adapter<PersonListAdapter.ViewHolder>() {
Вопрос 1)
Могу ли я просто написать приведенный выше код следующим образом (примечание MutableList<>
вместо ArrayList<>
), даже если я позаимствовал у Java-код Android?
class PersonListAdapter(private val list: MutableList<Person>,
private val context: Context) : RecyclerView.Adapter<PersonListAdapter.ViewHolder>() {
Вопрос 2)
Действительно ли лучше всегда использовать MutableList
над ArrayList
? Каковы основные причины? Часть той ссылки, которую я предоставляю выше, идет через голову, но мне кажется, что MutableList
это более слабая реализация, которая более способна изменяться и улучшаться в будущем. Это правильно?
1 ответ
ArrayList - это реализация интерфейса MutableList в Kotlin:
class ArrayList<E> : MutableList<E>, RandomAccess
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-array-list/index.html
Этот ответ может указывать, что MutableList должен выбираться всякий раз, когда это возможно, но ArrayList является MutableList. Поэтому, если вы уже используете ArrayList, на самом деле нет никакой причины использовать MutableList, тем более что вы не можете напрямую создать его экземпляр (MutableList - это интерфейс, а не класс).
На самом деле, если вы посмотрите на mutableListOf()
Метод расширения Котлина:
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
Вы можете видеть, что он просто возвращает ArrayList предоставленных вами элементов.
Разница в следующем:
если вы используете
ArrayList()
Вы явно говорите: " Я хочу, чтобы это былоArrayList
реализацияMutableList
и никогда не меняйся ни на что другое ".Если вы используете
mutableListOf()
это как сказать " Дай мне дефолт"MutableList
реализация ".
Текущая реализация по умолчанию MutableList
(mutableListOf()
) возвращает ArrayList
, Если в (маловероятном) случае это когда-либо изменится в будущем (если будет разработана новая более эффективная реализация), это может измениться на ...mutableListOf(): MutableList<T> = SomeNewMoreEfficientList()
,
В этом случае, где бы вы ни использовали в своем коде ArrayList()
это останется ArrayList
, Везде, где вы использовали mutableListOf()
это изменится с ArrayList
к блестяще названному SomeNewMoreEfficientList
,