如何在 Kotlin 中编写 getter

Vio*_*tta 2 kotlin

我懂一点java,目前正在学习kotlin。我不太清楚吸气剂。我有一个类和一些功能。

class Client(val personalInfo: PersonalInfo?){} //class

fun sendMessageToClient(client: Client?) {
     val personalInfo: PersonalInfo? = client?.personalInfo
    //...
}
Run Code Online (Sandbox Code Playgroud)

据我了解,代码中调用了getter client?.personalInfo。或者它是一个类字段,因为 private 没有在任何地方明确指定?

接下来,我想向 getter 添加一些逻辑,但我收到一个错误,表明这样的签名已经存在。

class Client(val personalInfo: PersonalInfo?){
    fun getPersonalInfo():PersonalInfo?{
        print(personalInfo)
        return personalInfo
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我指定该字段是私有的,错误就会消失class Client(private val personalInfo: PersonalInfo?),但是代码client?.personalInfo将无法工作

我尝试重写代码,但我不知道如何指定val并向其传递构造函数中的值

class Client(personalInfo: PersonalInfo?) {
    val personalInfo = //??
        get() {
            print("personal info $personalInfo")
            return personalInfo
        }
}
Run Code Online (Sandbox Code Playgroud)

是否有可能以某种方式添加print到吸气剂并仍然使用client?.personalInfo

Joã*_*ias 5

你就快到了。field在 kotlin 中创建自定义 getter 时,当您希望使用关联属性的值时,必须使用关键字(您可以在https://kotlinlang.org/docs/properties.html#backing的参考文档中阅读更多相关信息) -fieldshttps://www.baeldung.com/kotlin/getters-setters#1-accessing-the-backing-field):

\n
\n

我们定义的每个属性都由一个字段支持,该字段只能使用特殊的 field 关键字在其 get() 和 set() 方法中访问。field 关键字用于访问或修改属性\xe2\x80\x99s 值。这允许我们在 get() 和 set() 方法中定义自定义逻辑。

\n
\n

写完后,您只需要稍微更改一下代码,如下所示:

\n
class Client(personalInfo: String?) {\n    val personalInfo: String? = personalInfo\n        get() {\n            print("personal info $field")\n            return field\n        }\n}\n
Run Code Online (Sandbox Code Playgroud)\n