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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 04:10:05