在Kotlin转换过程中删除了二传手

时间:2019-06-27 16:49:39

标签: 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,然后将变量的访问修饰符从private更改为public?如果是这样,为什么又如何呢?设置程序和获取程序应成为Java抽象的一部分。 Kotlin不在乎吗?

我仍在学习Kotlin,并且依靠内置的转换作为最佳实践的初学者指南。只是在科特林不做二传手的情况?

3 个答案:

答案 0 :(得分:4)

您的字段+ getter / setter已转换为Kotlin Properties。因为field + getter / setter非常常见,所以Kotlin对此具有顶级支持。看起来您正在直接访问裸字段,但事实并非如此。 Kotlin向您隐藏了getter和setter的默认实现。在大多数情况下,我们只想获取或设置任何其他逻辑,因此我们无需查看它。每当您在Kotlin中访问apiKey时,您就在遍历getter或setter。

关于公开的原因,默认情况下,属性在Kotlin中是公开的。在上面我链接到的页面上,可以找到如何提供自己的get / set实现以及如何更改其访问级别。

答案 1 :(得分:2)

  

是否删除了我的设置器和获取器,然后将变量的访问修饰符从私有更改为公共?

是的

  

如果是,为什么

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

  

这很好吗?

惯用的Kotlin是将代码转换为Kotlin的合理默认选择。

  

Setter和Getters是Java中抽象的一部分。 Kotlin不在乎吗?

可以。但是,您现有的setter和getter没做任何事情,因此Kotlin转换将其删除,选择使用已经存在的默认setter和getter。

让我们假设您的代码看起来像这样:

private String apiKey;

public void setApiKey(String key) {
   this.key = key.toUpperCase();
}

public String getApiKey() {
   return key;
}

在此,设置方法要求API密钥始终为大写。

等效的Kotlin为:

var apiKey: String = "THE-DUDE-ABIDES"
  set(value) { field = value.toUpperCase() }

apiKey属性的消费者一直在使用getter和setter。只是从语法上讲,Kotlin使调用getter和setter的方式看起来像访问一个简单的字段。因此,apiKey的使用者无需执行任何其他操作即可使用默认设置器中的覆盖设置器(通过toUpperCase()调用)。

答案 2 :(得分:2)

我建议您阅读有关Kotlin的优质文档,例如property-getter-and-setter-kotlin,但我会给您一个小例子...

通常,他们删除了settergetter,它们仍然留在这里...事实是,如果您想override这些set和{{1} }您应该执行以下操作:

get

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

如果您进行override,则使用的是设置

如果您使用apiKey = ...,则使用的是 get 方法