Kotlin:构造函数初始化属性的Setter问题排查与修复
问题分析与修复
问题根源
- 构造参数未关联类属性:你定义的构造函数参数
propValue只是局部变量,没有将其赋值给类的propValue属性,导致实例创建后propValue始终以""作为初始值,而非你传入的构造参数值。 - 不可变集合的性能问题(次要):
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
相关产品推荐
相关产品推荐

