当前位置: 首页 > 知识库问答 >
问题:

静态编程语言转换期间删除的Setters/Getters

叶恩
2023-03-14

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

private String apiKey;

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

public String getApiKey() {
   return key;
}

成了

lateinit var apiKey: String

到底发生了什么?它是否移除了我的setters和getters,然后将变量的访问修饰符从private改为public?如果是,为什么以及如何是好的?Setters和getters是Java抽象的一部分。科特林不在乎这个?

我仍在学习 Kotlin,并且我依靠内置的转换作为最佳实践的初学者指南。这是否只是一种在 Kotlin 中不做 setter/getters 的情况?

共有3个答案

缑永年
2023-03-14

我建议您阅读关于< code>Kotlin的好文档,例如property-getter-and-setter-kot Lin,但我会给你一个小例子...

他们删除了<code>setter</code>和<code>getter</code>是很正常的,他们仍然在那里……问题是如果你想<code>覆盖<code>这些<code>set</code>和<code>get</code>你应该这样做:

private var apiKey: String
get() = "My apiKey is $apiKey"
set(value) {
    //Do whatever you want with apiKey
}

因此,如果您不想<code>覆盖</code>这些方法,只需使用以下方法即可访问:

如果您执行<code>apiKey=…</code>操作,则使用的是一个集合

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

淳于博
2023-03-14

它是否移除了我的setters和getters,然后将变量的访问修饰符从private改为public?

如果是,为什么

它为您拥有的代码生成惯用的静态编程语言。

这有什么好处?

惯用的Kotlin是Kotlin代码翻译器的合理默认选择。

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

当然可以。但是,您现有的setter和getter没有做任何事情,因此静态编程语言转换删除了它们,选择使用已经存在的默认setter和getter。

让我们假设您的代码如下所示:

private String apiKey;

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

public String getApiKey() {
   return key;
}

在这里,setter强制API键始终为大写。

对应的科特林应该是:

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

apiKey属性的使用者总是使用getter和setter。只是从语法上讲,Kotlin使调用getter和setter看起来像是访问一个简单的字段。因此,apiKey的使用者不需要做任何不同的事情来使用重写的setter(使用toUpperCase())和默认setter。

漆雕令秋
2023-03-14

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

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

 类似资料:
  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。

  • 我正在尝试将我的Java类转换为静态编程语言,这是Java代码: 这就是我把它转换成的: Lambda符号似乎根本不起作用,或者我就是搞不懂。我在Kotlin中发现的所有双函数示例都直接返回这样的值 双函数{名称,年龄- 这在语法上是正确的,但在返回某些内容之前,我需要一些额外的逻辑。出现两条错误消息: > 类型不匹配。必需:单位,找到:字符串 但我确实想返回一个字符串,我还显式声明了它。但是,还

  • 函数应将类型擦除列表转换为,即

  • 为了描述Gradle构建脚本,我们可以通过< code>build.gradle.kts文件使用Kotlin。在< code>dependencies和build 部分全局定义要使用的Kotlin版本是一个常见的问题(在给定的情况下使用不同的版本是相当罕见的)。 请考虑以下代码 (Gradle 4.3.1): 如您所见,kotlin(在本例中为1.2.30)定义了两次:和,它们通常没有区别。由于D

  • 上周我更新了Kotlin 1.5,昨天看到谷歌打算让Jetpack成为设计UI的首选选项后,我想做一些测试。 问题是将我的项目更新为静态编程语言1.5,当尝试构建项目时,我得到以下错误: 静态编程语言1.5与Jetpack Compose不兼容吗?在谷歌搜索问题后,我找到了版本,其中提到了Jetpack Compose,但不是以“不兼容”的方式。 你对此有任何答案吗?我应该使用吗?在这种情况下,我