Kotlin数据类字段如何用get/set同步修改MyApplication变量?
解决方案
方案1:给私有字段添加自定义Setter(推荐)
直接给_units字段添加自定义setter,在赋值时同步更新全局变量,同时对外暴露只读的units属性:
data class Thermostat( // ... 其他属性 @SerializedName("units") private var _units: String? ) : Serializable { // 给私有字段_units添加自定义setter private var _units: String? get() = field // 默认getter,直接返回字段值 set(value) { field = value // 先给字段赋值 // 同步更新全局变量,处理null情况避免空指针 MyApplication.temperatureServerIsCelsius = value?.equals("Fahrenheit", ignoreCase = true) != true } // 对外暴露只读的units属性,供外部获取值 val units: String? get() = _units }
关键点:
- 使用
field关键字引用字段本身,确保赋值操作生效 - 处理
value为null的情况,避免!!导致的空指针异常 - 反序列化时(如Gson解析),自定义setter会被触发,自动同步全局变量
方案2:直接给公开属性添加自定义Setter
如果不需要隐藏内部字段,可以直接把units作为公开属性,给它添加自定义setter:
data class Thermostat( // ... 其他属性 @SerializedName("units") var units: String? ) : Serializable { var units: String? set(value) { field = value // 同步更新全局变量 MyApplication.temperatureServerIsCelsius = value?.equals("Fahrenheit", ignoreCase = true) != true } }
这种写法更简洁,外部可以直接修改units属性,同时触发全局变量更新,数据类的自动生成方法(equals、hashCode等)也会基于units字段。
为什么你原来的写法不生效?
你之前的代码中,units是一个独立的变量,初始值为null,它的getter返回_units,但_units被直接赋值时(比如反序列化),并不会触发units的setter,所以全局变量不会更新。上面的方案直接把逻辑绑定到_units(或units)的赋值过程中,确保任何赋值操作都会同步更新全局变量。
内容的提问来源于stack exchange,提问作者Mohammad Taqi
相关产品推荐
相关产品推荐

