将带有getters和setter的Java类转换为Kotlin时出现问题

kd3sttzy  于 2022-10-07  发布在  Java
关注(0)|答案(1)|浏览(172)

我使用IntelliJ将Java代码转换为Kotlin。

我的Java类:

public class Test {

    private String mName;

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        this.mName = name.trim();
    }

}

转换的Kotlin类:

class Test {
    var name: String? = null
        private set

    fun setName(name: String) {
        this.name = name.trim { it <= ' ' }
    }
}

有没有办法将属性名称保留为“mName”?

=

附言:非常感谢@Sam的导游。

在转换后手动编辑Kotlin代码对我来说似乎不是一个好的选择,因为有很多这样的字段。我觉得在我的例子中,这是一个独立的项目(不是公共库),在将代码转换为kotlin之前,重构jave中的getter和setter名称会更容易,如下所示:

public class Test {
    private String mName;

    public String getMName() {
        return mName;
    }

    public void setMName(String name) {
        this.mName = name.trim();
    }
}

然后,转换后的Kotlin代码变为:

class Test {
    var mName: String? = null
        private set

    fun setMName(name: String) {
        mName = name.trim { it <= ' ' }
    }
}
vsdwdz23

vsdwdz231#

实际上,转换后的Kotlin类可以进一步优化,如下所示:

class Test {
    var name: String? = null
        set(value) {
            field = value?.trim()
        }
}

这是在利用一个隐式的支持字段。如果您想让它更明确,并自己命名Backup字段,您也可以使用Backding属性来实现:

class Test {
    private var mName: String? = null

    var name: String?
        get() = mName
        set(value) {
            mName = value?.trim()
        }
}

文档提到,在JVM上,“使用默认的getter和setter访问私有属性是优化的,以避免函数调用开销。”实际上,这意味着不会为mName属性生成getter和setter,因此您只会得到一个名为mName的私有字段。从Java的Angular 来看,我的第二个Kotlin示例看起来与您问题中的Java类相同。

相关问题