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

Kotlin中var与val的Getter差异:为何var未初始化报错val正常?

问题原因解析

核心区别:var与val的属性本质

  • val是只读属性:只需要提供读取逻辑(getter),不需要存储实际值的幕后字段(backing field)。当你只定义了val y的getter时,Kotlin会将其视为计算属性——每次访问y都会调用getter返回4,不存在需要初始化的存储字段,所以不会报错。
  • var是可变属性:同时支持读和写操作。如果你只定义了getter,Kotlin默认会认为这个属性需要一个幕后字段来存储值,因为var允许外部对它进行赋值(比如x = 5),默认的setter需要往这个字段里写入数据。但你没有初始化这个幕后字段,编译器就会抛出"Property must be initialized"的错误。

补充说明

如果你的var x确实不需要存储值,只是想通过getter返回固定结果,那要么改成val(因为不需要修改),要么显式定义一个空的setter(但这种场景下setter没有实际意义,因为赋值后getter还是返回4):

var x
    get() = 4
    set(value) {} // 空setter,避免编译器要求初始化字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:05:52