DiffUtil.ItemCallback - 定义为伴随对象还是类?

Posted

技术标签:

【中文标题】DiffUtil.ItemCallback - 定义为伴随对象还是类?【英文标题】:DiffUtil.ItemCallback - define as a companion object or as a class? 【发布时间】: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 的应用程序),而另一个显示来自数据库的数据,所以 我的问题是:与另一种相比,一种实现首选吗?它们之间有性能差异吗?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于DiffUtil.ItemCallback - 定义为伴随对象还是类?的主要内容,如果未能解决你的问题,请参考以下文章

在没有唯一标识符的项目上使用“ListAdapter”areItemsTheSame

table-cell完成左侧定宽,右侧定宽及左右定宽等布局

人工智能数学基础---定积分2:定积分的性质

数字货币定投

c语言 求定积分的通用函数

C语言求函数定积分