Kotlin-我们如何使用getter和setter访问私有财产?访问方法在内部调用吗?

vis*_*nny -2 java android kotlin

class Sample1 {
private var test = ""
    get() = field
    set(value) {
        field = value
   }}
Run Code Online (Sandbox Code Playgroud)

这是我的课。我想将该属性保留为私有,并且必须通过getter和setter访问该属性。

 var sample1 = Sample1()
Run Code Online (Sandbox Code Playgroud)

我试图创建一个对象并访问该属性,但是失败了。当我浏览文档时,我会发现一件有趣的事:“ Getters始终具有与属性相同的可见性”。链接

Kotlin的正确方法是什么?

zsm*_*b13 5

Kotlin将字段,其获取程序和设置程序(如果适用)分组为属性的单个概念。当访问属性时,总是使用更简单的语法调用其getter和setter,恰好与访问Java中的字段相同。但是支持该属性的实际字段是私有的,所有调用都通过getter和setter进行,它们与该属性本身(在您的情况下)具有相同的可见性private。因此,您的课程将翻译为:

public final class Sample1 {

    private String test = "";

    private String getTest() { return test; }

    private void setTest(String test) { this.test = test; }

}
Run Code Online (Sandbox Code Playgroud)

Sample1().text在Java中,您的调用看起来像这样(您实际上可以从调用此Kotlin类的Java代码中执行此操作):

new Sample1().getText();
Run Code Online (Sandbox Code Playgroud)

这就是说,解决方案是将属性的可见性更改为您在Java中设置的getter和setter可见性的任何值,例如,默认的公共可见性:

class Sample1 {
    var test = ""
        get() = field
        set(value) {
            field = value
        }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果没有声明显式的getter和setter,则会自动获得与上述实现相同的功能,因此可以将代码缩短为:

class Sample1 {
    var test = ""
}
Run Code Online (Sandbox Code Playgroud)

此最终代码等效于此Java类:

public final class Sample1 {

    private String test = "";

    public String getTest() { return test; }

    public void setTest(String test) { this.test = test; }

}
Run Code Online (Sandbox Code Playgroud)