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
相关产品推荐
相关产品推荐

