DiffUtil.ItemCallback声明为伴生对象还是类?哪种实现更优性能更高?
两种DiffUtil.ItemCallback实现方式的差异对比
核心区别
- 第一种
companion object DiffCallback : DiffUtil.ItemCallback<MarsProperty>()是伴生对象实现:属于Adapter类的静态共享实例,全局只会初始化一次,所有该Adapter的实例共用同一个DiffCallback对象。 - 第二种
class SleepNightDiffCallback: DiffUtil.ItemCallback<SleepNight>()是普通类实现:每次创建Adapter实例时都需要主动初始化一个新的DiffCallback对象,不同Adapter实例持有的是不同的DiffCallback实例。
性能差异
两种写法的性能差距在绝大多数场景下可以忽略,仅在Adapter被高频创建的场景(如嵌套RecyclerView存在大量子Adapter实例)下有微小差异:
伴生对象写法因为全程只创建一个实例,避免了重复创建对象的内存开销,性能表现略优于普通类写法。
优先推荐规则
两种写法没有绝对的优劣,根据实际场景选择即可:
- 优先选择伴生对象写法:如果你的DiffCallback不需要依赖任何外部动态参数(比如比较逻辑固定,不需要额外传入上下文、筛选规则、资源值等变量),这种写法更简洁,也不会造成不必要的内存占用。
- 必须选择普通类写法:如果DiffCallback的比较逻辑需要依赖动态参数,比如不同列表场景下的条目判断规则不同、需要用到上下文获取字符串做内容对比等,只能通过普通类构造函数传入依赖参数实现,伴生对象是静态共享属性,持有动态外部引用会有内存泄漏风险。
你提到的两个示例分别对应网络加载图片、数据库存储数据的场景,和两种DiffCallback写法的选择没有关联,只是课程为了演示不同实现方式的刻意安排。
内容的提问来源于stack exchange,提问作者George Ampartzidis
相关产品推荐
相关产品推荐

