kotlin - 获取和设置依赖于其他字段的方法
问题描述
我不知道如何在标题中表达这一点。什么是 Kotlin 等价于 Java 代码。我所有的尝试都以错误或 stackoverflow 告终。使用 Jackson 进行序列化时会发生这种情况。
public class Test {
private String test1;
private String test2;
public String getTest1() {
return test1;
}
public void setTest1(String test1) {
this.test1 = test1;
}
public String getTest2() {
return test2!=null? test2:test1;
}
public void setTest2(String test2) {
this.test2 = test2;
}
}
下面的 Kotlin 代码,
class Test(var test1: String? = "") {
var test2: String?
get() = if (StringUtils.isNotEmpty(test2)) test2 else test1
set(test2Val) {
test2 = test2Val
}
}
我缺少哪些 Kotlin 基础知识?
解决方案
test2
最终会调用吸气剂。您可以查看生成的 Java 代码以供参考。
在自定义 getter 和 setter 中,您可以使用field
。所以正确的代码是:
class Test(var test1: String? = "") {
var test2: String?
get() = if (StringUtils.isNotEmpty(field)) field else test1
set(test2Val) {
field = test2Val
}
}
注意:这会导致第二个问题。您还没有初始化变量,这与 vars 有关系。如果您有一个val
返回其他内容的自定义 getter(即val x = ... get() = someOtherVar
,不会给出编译器错误)。但是这不适用于var
s。但是,在您的情况下,使用= null
(或替代= ""
)应该就足够了。
但是既然你说你得到了 StackOverflowErrors 而不是与缺乏初始化相关的错误,我猜你实际上确实初始化了它,但只是没有将它包含在 MCVE 中。但如果你没有,那值得注意。
此外,Kotlin 具有类似isNotEmpty()
和的方法,isNotBlank()
它们取代了对 的需要StringUtils.isNotEmpty()
,并且被称为 like field.isNotEmpty()
。请注意,您要在此处执行if(field?.isNotEmpty() == true) ...
,因为您最终会得到一个可为空的布尔值。这也意味着如果字段为空或为空,它将返回 test1。isNotBlank
如果您喜欢,也可以添加。
如果 setter 与生成的 setter 完全相同,则无需手动声明它们。如果您这样做,像 IntelliJ 这样的 IDE 也会警告您,并建议您删除它。如果它是默认设置器,是否手动声明它并不重要,但它可以帮助您编写更少的代码。
推荐阅读
- javascript - 在 iOS 模拟器上运行 react-native 应用程序
- python - 使用熊猫将行删除到列中的条件
- c++ - C++ 创建 2d 矢量错误消息 C26444
- angular - 错误:“可观察”类型上不存在属性“地图”
' - serverless-framework - 如何在脚本中解析 serverless.yml 文件
- java - 第二次调用类方法时,@Value 字段显示为空
- laravel - 无法使用 Forge、nginx 和 AWS 连接到 Laravel Websocket
- c# - 检查经理列表是否包含其经理的任何员工列表中的员工,该员工也是经理
- 8085 - 8085 程序在 8085 模拟器中添加两个 8 位数字
- discord - 是否可以检查用户是否启用了 PM?