首页 > 解决方案 > DiffUtil.ItemCallback - 定义为伴随对象还是类?

问题描述

我目前正在通过 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 的那个),而另一个显示来自数据库的数据,所以我的问题是:与另一种实现相比,一种实现更受欢迎吗?它们之间有性能差异吗?

标签: kotlinandroid-recyclerviewlistadapterandroid-diffutils

解决方案


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

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

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


推荐阅读