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

Kotlin中Getter/Setter如何与类中对应属性绑定?关联机制是什么?

Kotlin属性与Getter关联的常见疑问解答

先附上你提到的示例代码:

class Rectangle(val width: Int, val height: Int) {
    val area: Int 
        get() = this.width * this.height
}

问题1:该代码中的get方法如何知晓它属于area属性?

这是Kotlin语法规则直接定义的:当你声明一个属性(比如val area: Int)后,后续缩进的访问器(get/set)代码块会被编译器关联到这个属性上。本质上,get()不是一个独立的函数,而是属性声明语法的一部分,它依附于前面的属性声明存在。编译器会按照代码的语法结构,把紧跟在属性声明后的访问器绑定到该属性。

问题2:若类中存在另一个属性(如length)并配有对应的get方法,编译器如何区分不同get方法所属的属性?

每个属性的访问器都属于自己的属性声明上下文。比如添加length属性的代码:

class Rectangle(val width: Int, val height: Int) {
    val area: Int 
        get() = this.width * this.height
    
    val length: Int
        get() = this.width * 2
}

编译器会依据代码的结构边界(属性声明的结束、新属性的开始)区分归属:area的get()紧跟在val area: Int之后,length的get()紧跟在val length: Int之后,二者属于不同的属性声明块,编译器能清晰识别对应关系。

问题3:若val area被大括号包裹,关联关系会很清晰,但当前写法下,属性与Getter/Setter的关联是否依赖空格等语法规则?

不是依赖空格,而是依赖Kotlin的语法结构定义。缩进只是提升代码可读性的规范,哪怕你不缩进(强烈不推荐这种写法),编译器依然能识别get()属于前面的属性:

// 语法合法但可读性极差
val area: Int
get() = this.width * this.height

属性的访问器(get/set)本身就是属性声明语法的一部分,和属性声明是一个整体。大括号包裹的写法只是另一种语法形式(比如用于多语句的getter),本质上和当前写法等价,都是编译器通过语法结构绑定属性与访问器。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 10:12:35