Kotlin中主构造器属性的默认访问器实现疑问
Kotlin主构造器中属性的默认Getter/Setter实现
你对color属性的默认Getter/Setter的理解完全正确!那主构造器里声明的width和height属性,它们的默认实现其实和类体里的属性完全一致,同样会生成幕后字段(backing field),也可以在自定义Getter/Setter中使用field标识符。
核心结论
当你在主构造器中用var(或val)修饰参数时,这个参数会直接成为类的属性,编译器会自动为它:
- 创建对应的幕后字段(和
color的field逻辑一致) - 生成默认的Getter和Setter(如果是
var),或者仅Getter(如果是val)
默认实现示例
对于你代码里的width,它的默认Getter/Setter等价于:
var width: Int get() = field set(value) { field = value }
height的实现和width完全相同。
为什么可以用field?
主构造器中声明的属性,幕后字段会在对象实例化时,通过构造器传入的参数完成初始化,本质和类体里的属性没有区别。所以如果你需要自定义Getter/Setter,同样可以用field来访问这个幕后字段。比如给width加一个非负校验:
class Square(width: Int, height: Int) { // 用主构造器参数初始化属性,自定义Setter var width = width set(value) { if (value >= 0) field = value else throw IllegalArgumentException("Width cannot be negative") } var height = height var color: String = "red" }
额外说明
如果主构造器参数没有用var/val修饰,那它只是一个普通的构造器参数,不会成为类的属性,自然也不会生成Getter/Setter和幕后字段——这也是区分“构造器参数”和“类属性”的关键。
内容的提问来源于stack exchange,提问作者shinobitiger310
相关产品推荐
相关产品推荐

