kotlin - 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 的那个),而另一个显示来自数据库的数据,所以我的问题是:与另一种实现相比,一种实现更受欢迎吗?它们之间有性能差异吗?
解决方案
这可能是一个见仁见智的问题。我的是回调应该是一个object
或匿名对象,而不是一个companion object
.
它所做的只是比较两个对象的属性。它不必保持任何状态。object
所以它是一个单例而不是class
你必须实例化的一个是有意义的。无论您将其定义为命名单例object
还是将其定义为分配给属性的匿名对象,在传达意图方面都没有太大区别。
但是对我来说把它变成一个companion
. 它已经嵌套并且有一个名字。所做companion
的只是建议您应该需要直接调用它的函数,并且该名称PhotoGridAdapter
也应该被认为是回调。例如,它使您能够将名称PhotoGridAdapter
作为其 DiffUtil 回调传递给其他适配器,这是荒谬的。它可能有意义的唯一原因是,如果您还想将它用作比较项目的实用程序,那么您可以PhotoGridAdapter.areContentsTheSame
直接调用函数。但是,我认为这不太可能。通常,回调函数的内容要么像传递一样非常琐碎,要么equals()
非常特定于更新显示列表的性质。
推荐阅读
- apache-spark - Gcloud 计算 ssh --zone=us-east1-d --ssh-flag="-D" --ssh-flag="10000" --ssh-flag="-N" "spark-01-m" 不是在职的
- crystal-reports - Crystal Report 不显示数据库中的当前记录
- algorithm - 什么是项目列表的“最佳”顺序,以最小化取决于其顺序的成本函数
- android - 如何在 mediastorage android 中写入/读取视频媒体文件?
- r - 编写包时在 R 中找不到文件:正确的方法是什么?
- javascript - 为什么 Safari iOS 认为 iPad Pro 最多可以处理 5 次触控?
- python - 用于预测文本数据的管道 API - 'AttributeError:
- ubuntu - 在视频中添加超链接
- sql - 问题:Source和Targetdestination解析问题SQL
- javascript - 在 ReactJS 的 FormData 中使用时,头像总是显示为未定义