Avatar ·

Kotlin中的Getter和Setter:如何声明和使用带有自定义访问器的属性?

大家好!我最近从Java开始学习Kotlin,遇到了对getter和setter工作原理的困惑。在Java中,我习惯显式声明带有访问修饰符的字段,然后为它们编写getField()和setField()方法。而在Kotlin中,据我了解,情况完全不同——有属性(properties),它们会自动生成getter和setter。

// 我尝试的示例
class Person {
    var name: String = "Unknown"
    var age: Int = 0
    
    // 我尝试为age创建自定义setter
    set(value) {
        if (value >= 0) {
            // 如何在这里访问字段?用field?还是this.age?
            this.age = value // 导致递归!
        } else {
            println("年龄不能为负数")
        }
    }
}

当我运行这段代码时,由于无限递归,我得到了StackOverflowError。我知道我做错了什么,但无法弄清楚: