猿问

在 Kotlin 转换期间删除了 Setter/Getter

将基于 Java 的模型类转换为 Kotlin 后,我注意到我的 setter 和 getter 方法被删除了。曾经是什么


private String apiKey;


public void setApiKey(String key) {

   this.key = key;

}


public String getApiKey() {

   return key;

}

成为


lateinit var apiKey: String

到底发生了什么事?它是否删除了我的 setter 和 getter,然后将我的变量的访问修饰符从私有更改为公共?如果是这样,为什么以及如何做到这一点?Setter 和 getter 是 Java 抽象的一部分。Kotlin 不关心这个?


我仍在学习 Kotlin,我依赖内置的转换作为最佳实践的初学者指南。这只是您不在 Kotlin 中执行 setter/getter 的情况吗?


阿波罗的战车
浏览 142回答 3
3回答

慕娘9325324

您的 field + getter/setter 已转换为Kotlin Properties。因为字段 + getter/setter 非常常见,Kotlin 对它有顶级支持。看起来您正在直接访问裸字段,但事实并非如此。Kotlin 对您隐藏了 getter 和 setter 的默认实现。在大多数情况下,我们只是想要一个没有任何其他逻辑的 get 或 set,所以我们不需要看到它。任何时候你apiKey在 Kotlin 中访问,你都在通过 getter 或 setter。至于为什么是public,属性在Kotlin中默认是public的。如何提供您自己的 get/set 实现,以及如何更改它们的访问级别,可以在我上面链接的页面上找到。

慕姐4208626

它是否删除了我的 setter 和 getter,然后将我的变量的访问修饰符从私有更改为公共?是的。如果是这样,为什么它为您拥有的代码生成了惯用的 Kotlin。这有什么好?Idiomatic Kotlin 是 Kotlin 代码翻译器的合理默认选择。Setter 和 getter 是 Java 抽象的一部分。Kotlin 不关心这个?当然可以。但是,您现有的 setter 和 getter 没有做任何事情,因此 Kotlin 转换删除了它们,选择使用已经存在的默认 setter 和 getter。让我们假设您的代码如下所示:private String apiKey;public void setApiKey(String key) {   this.key = key.toUpperCase(); }public String getApiKey() {   return key; }此处,setter 强制 API 密钥始终为大写。等效的 Kotlin 将是:var apiKey: String = "THE-DUDE-ABIDES"   set(value) { field = value.toUpperCase() }您的财产的消费者apiKey总是使用 getter 和 setter。只是,在语法上,Kotlin 让调用 getter 和 setter 看起来就像访问一个简单的字段。因此,消费者apiKey不需要做任何不同的事情来使用toUpperCase()默认设置器中的重写设置器(通过调用)。

绝地无双

我建议你阅读一个很好的文档,Kotlin例如property-getter-and-setter-kotlin但我会给你一个小例子......setter他们移除是正常的getter,他们仍然在那里......问题是,如果你想要override这些set,get你应该做类似的事情:private var apiKey: Stringget() = "My apiKey is $apiKey"set(value) {    //Do whatever you want with apiKey}所以,如果你不想使用override这些方法,你可以简单地使用以下方法访问它:如果你这样做,apiKey = ...你正在使用一套如果你使用var newVar = apiKey你正在使用get方法
随时随地看视频慕课网APP

相关分类

Java
我要回答