【问题标题】:DiffUtil.ItemCallback - define as a companion object or as a class?DiffUtil.ItemCallback - 定义为伴随对象还是类?
【发布时间】:2021-07-28 21:50:39
【问题描述】:

我目前正在通过 Udacity 的 Kotlin Android 开发人员计划学习 Kotlin。有两个使用 DiffUtil.ItemCallback 的示例应用程序,但以不同的方式声明它。两个示例应用程序都使用 ListAdapter,但其中一个应用程序声明 DiffUtil,如下所示:companion object DiffCallback : DiffUtil.ItemCallback<MarsProperty>()

而另一个是这样的:class SleepNightDiffCallback: DiffUtil.ItemCallback<SleepNight>()

两个 DiffUtils 都作为参数传递给 ListAdapter,唯一的区别是在类实现的情况下,它必须被初始化:

class PhotoGridAdapter : ListAdapter<MarsProperty, PhotoGridAdapter.ViewHolder>(DiffCallback)
class SleepNightAdapter : ListAdapter<SleepNight, SleepNightAdapter.ViewHolder>(SleepNightDiffCallback())

这些示例应用程序之间的唯一区别是,一个从 Internet 下载并显示图像(带有 PhotoGridAdapter 的应用程序),而另一个显示来自数据库的数据,所以 我的问题是:与另一种相比,一种实现首选吗?它们之间有性能差异吗?

【问题讨论】:

    标签: kotlin android-recyclerview listadapter android-diffutils


    【解决方案1】:

    这可能是一个见仁见智的问题。我的是回调应该是object,或匿名对象,而不是companion object

    它所做的只是比较两个对象的属性。它不必保持任何状态。所以它是一个单例object 而不是你必须实例化的class 是有意义的。无论您将其定义为命名单例 object 还是将其定义为分配给属性的匿名对象,在传达意图方面都没有太大区别。

    但将其设为companion 对我来说没有意义。它已经嵌套并且有一个名字。所有companion 所做的只是建议您需要直接调用它的函数,并且名称PhotoGridAdapter 也应该被认为是一个回调。例如,它使您能够将名称 PhotoGridAdapter 作为其 DiffUtil 回调传递给其他适配器,这是荒谬的。它可能有意义的唯一原因是,如果您还想将它用作比较项目的实用程序,那么您可以直接调用像 PhotoGridAdapter.areContentsTheSame 这样的函数。但是,我认为这不太可能。通常,回调函数的内容要么非常琐碎,例如通过equals(),要么非常特定于更新显示列表的性质。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2019-10-11
      相关资源
      最近更新 更多