首页 > 解决方案 > 获取和设置依赖于其他字段的方法

问题描述

我不知道如何在标题中表达这一点。什么是 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 基础知识?

标签: kotlinjackson

解决方案


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,不会给出编译器错误)。但是这不适用于vars。但是,在您的情况下,使用= null(或替代= "")应该就足够了。

但是既然你说你得到了 StackOverflowErrors 而不是与缺乏初始化相关的错误,我猜你实际上确实初始化了它,但只是没有将它包含在 MCVE 中。但如果你没有,那值得注意。


此外,Kotlin 具有类似isNotEmpty()和的方法,isNotBlank()它们取代了对 的需要StringUtils.isNotEmpty(),并且被称为 like field.isNotEmpty()。请注意,您要在此处执行if(field?.isNotEmpty() == true) ...,因为您最终会得到一个可为空的布尔值。这也意味着如果字段为空或为空,它将返回 test1。isNotBlank如果您喜欢,也可以添加。

如果 setter 与生成的 setter 完全相同,则无需手动声明它们。如果您这样做,像 IntelliJ 这样的 IDE 也会警告您,并建议您删除它。如果它是默认设置器,是否手动声明它并不重要,但它可以帮助您编写更少的代码。


推荐阅读