Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Kotlin转换期间删除的setter/getter_Java_Android_Kotlin - Fatal编程技术网

Java Kotlin转换期间删除的setter/getter

Java Kotlin转换期间删除的setter/getter,java,android,kotlin,Java,Android,Kotlin,在将基于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,然后

在将基于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,然后将变量的访问修饰符从private更改为public?如果是这样的话,为什么这样好?setter和getter是Java抽象的一部分。科特林不在乎这个


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

您的字段+getter/setter已转换为。因为field+getter/setter非常常见,所以Kotlin对它有顶级支持。看起来您可能直接访问裸字段,但事实并非如此。Kotlin对您隐藏了getter和setter的默认实现。在大多数情况下,我们只想在没有任何其他逻辑的情况下得到一个get或set,所以我们不需要看到它。任何时候在Kotlin中访问
apiKey
,都是通过getter或setter

至于为什么它是公共的,默认情况下Kotlin中的属性是公共的。如何提供自己的get/set实现,以及如何更改它们的访问级别,可以在我上面链接的页面上找到

它是否删除了我的setter和getter,然后将变量的访问修饰符从private更改为public

若然,原因为何

它为您拥有的代码生成了惯用的Kotlin

这个怎么样

惯用Kotlin是Kotlin的代码转换器的合理默认选择

setter和getter是Java抽象的一部分。科特林不在乎这个

当然有。但是,您现有的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
的使用者不需要做任何不同的事情来使用覆盖的setter(使用
toUpperCase()
调用)和默认setter。

我建议您阅读一篇关于
Kotlin
的好文档,例如,但我将给您举一个小例子

他们删除了
setter
getter
是正常的,他们仍然在那里。。。问题是,如果您想
覆盖
这些
设置
获取
,您应该执行以下操作:

private var apiKey: String
get() = "My apiKey is $apiKey"
set(value) {
    //Do whatever you want with apiKey
}
因此,如果您不想覆盖这些方法,只需使用以下方法访问:

如果您使用
apiKey=…
则使用的是集合


如果您使用
var newVar=apiKey
您使用的是get方法

Kotlin具有隐含的getter和setters哇,非常好的响应。现在已经非常清楚了。我懂了。我想我的IDE一直都知道它在做什么:-)