You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中val与get()组合是否冗余?ViewBinding实现写法疑问

问题解答

疑问1:val和get()的作用是否重叠,代码是否冗余?

完全不冗余,二者作用完全不同:

  • Kotlin中val修饰属性的核心作用是限制该属性为只读属性,禁止外部对其直接赋值,避免上层逻辑随意修改binding指向,破坏封装性。
  • 自定义get()的作用是每次访问binding属性时,都会重新获取当前_binding的最新值再强转为非空,这个属性本身没有单独的存储字段,不会缓存旧值。

如果去掉val改成var,会允许上层执行binding = xxx的赋值操作,不符合我们只需要暴露只读视图绑定的设计;如果去掉自定义getter,就变成了普通的属性初始化,直接触发第二个疑问里的问题。

疑问2:为什么优于private val binding = _binding!!的写法?

这个写法是完全不可用的,有两个致命问题:

  • 触发时机错误:Fragment类初始化时就会执行普通属性的赋值逻辑,此时_binding还处于初始的null值,直接执行_binding!!会立刻抛出空指针异常,应用根本无法正常启动。
  • 会缓存旧值导致内存泄漏:退一步说就算你能在类初始化时给_binding赋值,普通val属性会把初始化时的值缓存下来,后续就算在onDestroyView中将_binding置为null,binding还是会持有旧的View绑定实例,导致View无法被GC回收,产生内存泄漏。

官方推荐的写法完全匹配Fragment的View生命周期:_binding作为幕后属性,仅在onCreateView到onDestroyView的生命周期区间持有非空值,其他时候置空避免内存泄漏;对外暴露的binding每次访问都会取最新的_binding值,既能保证View生命周期内访问都是非空可用,也能在生命周期外访问时及时崩溃暴露生命周期误用问题。


内容的提问来源于stack exchange,提问作者johnp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:54:03