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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:34:28