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

DiffUtil.ItemCallback - define as a companion object or as a class?

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

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

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

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

这些示例应用程序之间的唯一区别是,一个示例应用程序从 Internet 下载并显示图像(带有 PhotoGridAdapter 的一个),而另一个显示数据库中的数据,因此 我的问题是:与另一种相比,一种实现方式 更受青睐 吗?它们之间有什么性能差异吗?

这大概见仁见智吧。我的是回调应该是 object 或匿名对象,而不是 companion object.

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

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