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 - 定义为伴随对象还是类?的主要内容,如果未能解决你的问题,请参考以下文章