Использование Kotlin MutableList или ArrayList, где списки необходимы в Android - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь освоить «родной путь 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 - более слабая реализация, которая более способна изменяться и улучшаться в будущем. Это правильно?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Разница:

  • если вы используете ArrayList(), вы явно говорите: " Я хочу, чтобы это была ArrayList реализация MutableList и никогда не изменяться на что-либо еще ".

  • Если вы используете mutableListOf(), это все равно, что сказать " Дайте мне стандартную MutableList реализацию ".

Текущая реализация по умолчанию MutableList (mutableListOf()) возвращает ArrayList. Если в (маловероятном) случае это когда-либо изменится в будущем (если будет разработана новая более эффективная реализация), это может измениться на ...mutableListOf(): MutableList<T> = SomeNewMoreEfficientList().

В этом случае, где бы в вашем коде вы не использовали ArrayList(), оно останется ArrayList. Где бы вы ни использовали mutableListOf(), это изменится с ArrayList на блестяще названный SomeNewMoreEfficientList.

0 голосов
/ 09 ноября 2018

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() Kotlin:

public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()

вы можете видеть, что он просто возвращает ArrayList предоставленных вами элементов.

...