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

Kotlin:构造函数初始化属性的Setter问题排查与修复

问题分析与修复

问题根源

  1. 构造参数未关联类属性:你定义的构造函数参数propValue只是局部变量,没有将其赋值给类的propValue属性,导致实例创建后propValue始终以""作为初始值,而非你传入的构造参数值。
  2. 不可变集合的性能问题(次要):previousPropertyValue使用不可变的List,每次执行+=都会创建新列表,频繁操作时效率较低,不过这不是你无法获取值的直接原因。

修复方案

方案1:直接在构造函数中声明属性并自定义Setter

这种方式更简洁,同时将构造参数与类属性绑定:

package com.example.propory

class Property(val name: String, var propValue: String) {
    // 改用MutableList提升操作效率,可选private set禁止外部修改
    var previousPropertyValue: MutableList<String> = mutableListOf("testing")
        private set

    init {
        // 初始化时将初始属性值加入历史记录(可选)
        previousPropertyValue.add(propValue)
    }

    // 自定义Setter逻辑,用field直接访问幕后字段
    set(value) {
        previousPropertyValue.add(field)
        field = value
    }
}

方案2:保持原有结构,初始化类属性为构造参数值

如果你希望构造参数不直接暴露为类属性,可以这样修改:

package com.example.propory

class Property(val name: String, propValue: String) {
    var previousPropertyValue: MutableList<String> = mutableListOf("testing")
    
    // 用构造参数初始化propValue属性
    var propValue: String = propValue
        set(value) {
            previousPropertyValue.add(field)
            field = value
        }
}

关键说明

  • 修复后,创建实例时propValue会被初始化为你传入的构造参数值,执行currentProperty.propValue = property.propValue后,就能正确获取到赋值后的内容。
  • 使用MutableList替代List可以避免频繁创建新集合,如果你不需要修改历史记录集合,可添加private set限制外部修改权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:00:28