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

Kotlin中Getter/Setter方法的调用与定义规则疑问

Kotlin属性访问器的常见疑问解答

咱们逐个拆解你提出的疑问:

1. Kotlin如何确定调用对应的setter方法?

这其实是个很关键的知识点:Kotlin是通过属性名称来绑定访问器(getter/setter)的,而不是靠参数类型。

在你的代码里,car.speed = 65这条语句,编译器会识别出你是在给Car类的speed属性赋值,它会直接关联到speed属性声明后面的那个set方法——哪怕price属性的setter参数类型也是Int,这完全不影响匹配逻辑。

简单说:你操作的是哪个属性变量,就会调用那个属性对应的setter。比如如果写car.price = 65,编译器就会调用price属性的setter,和参数类型无关。

另外补充一句:你代码里的getter和setter其实都是默认实现(比如get() = field就是直接返回字段值,set也是直接赋值给field),其实可以省略不写,Kotlin会自动生成这些默认访问器。

2. 属性的定义顺序是否至关重要?

完全不重要。编译器识别属性是靠名称,和属性在类里的定义顺序没有任何关系。

比如你把Car类里的属性顺序改成:

class Car(vendor: String = "Unknown", speed: Int = 0, price: Int = 0) {
    var price = price
        get() = field
        set(newPrice: Int) { field = price }
    var speed = speed
        get() = field
        set(speed: Int) { field = speed }
    var vendor = vendor
        get() = field
        set(newVendor: String) { field = newVendor }
}

执行car.speed = 65的时候,依然会调用speed属性的setter,不会因为它的定义顺序在price之后就出错。

3. Getter/Setter是否必须紧跟属性定义?

是的,这是Kotlin的语法规则。属性的访问器(getter和setter)必须作为属性声明的一部分,直接写在属性定义的后面,不能拆分到类的其他位置。

比如你不能先定义var speed = speed,然后在类的末尾再给它加getter和setter,这样编译器会报错,因为它无法把后面的访问器和前面的属性关联起来。

4. 缩进是编码惯例还是编译器必需?

缩进仅仅是编码惯例,编译器完全不关心缩进格式。

比如你把访问器写成这样(完全不缩进):

var speed = speed
get() = field
set(speed: Int) { field = speed }

编译器依然能正常识别,不会报错。但为了代码的可读性,我们还是建议按照规范缩进(比如把get和set缩进在属性的下一级),这样团队协作的时候大家都能轻松看懂代码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:12:30