【问题标题】:Using Kotlin's MutableList or ArrayList where lists are needed in Android在 Android 中需要列表的地方使用 Kotlin Mutable List 或 ArrayList
【发布时间】:2019-04-12 14:19:23
【问题描述】:

我正在尝试学习“Kotlin 原生方式”在 Android 中做事,同时我既不是 Kotlin、Java 也不是 Android 开发方面的专家。具体来说,何时使用ArrayListMutableList

在我看来MutableList should be chosen whenever possible。然而,如果我查看 Android 示例,他们似乎总是选择 ArrayList(据我目前发现)。

下面是一个使用 ArrayList 并扩展 Java 的 RecyclerView.Adapter 的工作示例的 sn-p。

class PersonListAdapter(private val list: ArrayList<Person>,
                        private val context: Context) : RecyclerView.Adapter<PersonListAdapter.ViewHolder>() {

问题 1)

我可以简单地将上面的代码写成如下(注意MutableList&lt;&gt;而不是ArrayList&lt;&gt;),即使我是从Android的Java代码中借用的?

class PersonListAdapter(private val list: MutableList<Person>,
                        private val context: Context) : RecyclerView.Adapter<PersonListAdapter.ViewHolder>() {

问题 2)

总是使用MutableList 而不是ArrayList 真的更好吗?主要原因是什么?我在上面提供的一些链接超出了我的想象,但在我看来,MutableList 是一个更松散的实现,将来更有能力改变和改进。对吗?

【问题讨论】:

    标签: android arraylist kotlin mutablelist


    【解决方案1】:

    ArrayList 是 Kotlin 中 MutableList 接口的实现:

    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。

    【讨论】:

    • 是的,@TheWanderer,我看到 mutableListOf 实际上只是 ArrayList 在引擎盖下。我不知何故没有注意到MutableList 只是一个接口。所以,这有帮助!但是为什么在这种情况下甚至有mutableListOf?我想我还是不懂哲学;对我来说,这似乎有点像污染命名空间:现在有两个函数精确地 做同样的事情。对我来说,像这样增加认知负荷而没有任何好处似乎是糟糕的编程,但我认为我一定是错的,我必须遗漏一些东西。
    • @MikeWilliamson 它返回一个 ArrayList 的实例,但在 MutableList 类型下。我不知道你有什么理由要使用它,但它与 arrayListOf() 不同。
    • 是的,没错,当然。我忘记了。所以......微不足道的不同,但确实不同。 :-)
    • 因为ArrayList is an implementation of the MutableList interface 我不明白为什么在使用 RxJava 使用 Moshi 和 Retrofit2 时,你不能使用 Observable> 只使用 MutableList、List 和这里提到的其他类型github.com/square/moshi#built-in-type-adapters
    • 为什么当我在 Kotlin 中查看 ArrayList 的源代码时,它没有显示它是从 MutableList 派生的?它使用这行代码将我重定向到 TypeAliases.ktx @SinceKotlin("1.1") public actual typealias ArrayList&lt;E&gt; = java.util.ArrayList&lt;E&gt;
    【解决方案2】:

    区别在于:

    • 如果您使用 ArrayList(),您明确表示“我希望这是 MutableListArrayList 实现,并且永远不会更改为其他任何内容”。

    • 如果你使用mutableListOf(),就像说“给我默认的MutableList 实现”。

    MutableList (mutableListOf()) 的当前默认实现返回 ArrayList。如果将来发生这种情况(不太可能)发生变化(如果设计了一个新的更高效的实现),这可能会更改为...mutableListOf(): MutableList&lt;T&gt; = SomeNewMoreEfficientList()

    在这种情况下,无论您在代码中使用ArrayList() 的哪个位置,它都将保持为ArrayList。无论您在哪里使用 mutableListOf(),它都会从 ArrayList 更改为出色的 SomeNewMoreEfficientList

    【讨论】:

    • 什么时候推荐使用ArrayList而不是List
    • @IgorGanapolsky 您将明确使用ArrayList 如果您想确保您的实现永远不会更改为其他任何内容(如果mutableListOf() 将来发生更改以返回其他内容,请保留ArrayList 事件)。请注意,实现更改的唯一原因可能是一些新的SomeNewMoreEfficientList 的出现来替换ArrayList。从这个角度来看,人们可能希望交换发生。除非您从 ArrayList 中识别出您的应用所依赖的特定内容,并且您认为它可能会发生变化,否则请使用 mutableListOf
    • 是的,IMO mutableListOf 总体上比 ArrayList 好
    猜你喜欢
    • 2015-07-07
    • 2018-03-20
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 2023-02-23
    • 2021-07-24
    • 2019-01-22
    相关资源
    最近更新 更多