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

我们如何用getter和setter访问私有属性?访问方法是内部调用吗?[重复]

公冶阳德
2023-03-14
class Sample1 {
private var test = ""
    get() = field
    set(value) {
        field = value
   }}

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

 var sample1 = Sample1()

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

科特林的正确方法是什么?

共有1个答案

施俊明
2023-03-14

Kotlin 将字段、其 getter 和 setter(如果适用)分组为属性的单一概念。当您访问属性时,您总是调用其 getter 和 setter,只是使用更简单的语法,这恰好与访问 Java 中的字段相同。但是支持该属性的实际字段是私有的,并且所有调用都通过 getter 和 setter,它们与属性本身具有相同的可见性,在您的情况下,是私有的。所以你的类会翻译成:

public final class Sample1 {

    private String test = "";

    private String getTest() { return test; }

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

}

以及对<code>Sample1()的调用。文本在Java中看起来像这样(实际上,您可以从调用此Kotlin类的Java代码中执行此操作):

new Sample1().getText();

总之,解决方案是将属性的可见性更改为您在Java中设置的getter和setter可见性,例如,默认的public可见性:

class Sample1 {
    var test = ""
        get() = field
        set(value) {
            field = value
        }
}

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

class Sample1 {
    var test = ""
}

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

public final class Sample1 {

    private String test = "";

    public String getTest() { return test; }

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

}
 类似资料:
  • 我在我的项目中添加了Lombok maven存储库并成功使用了Lombok注释。我试图从另一个类访问setter和getter方法,但无法访问这些方法。我使用的是Spring Boot版本2.1.1和STS。这是我的简单代码片段。

  • 问题内容: 如果我有一个包私有的Java类(用“ class”声明,而不是“ public class”),那么将内部方法声明为public或protected或package- private确实没有区别,对吗?那么我应该使用哪个,或者什么时候该使用呢?我有点困惑。 问题答案: 如果我有一个包私有的Java类(用“ class”声明,而不是“ public class”),那么将内部方法声明为p

  • 我对Angular/Typescripting有点困惑。我认为应该隐藏属性,以防止对属性值进行任何可能的外部更改。 例如: 还有一些模板 但是在阅读中,由于在页面上发生的每次更改检测下都会调用方法,因此绑定到html模板中的方法存在性能问题。 我看到的选择是要么将其作为公共财产,要么使用管道。 管道似乎有点矫枉过正,必须为需要绑定的页面中的每个属性实现,并且公共变量几乎总是不行的。 我在Angul

  • 如何在Kotlin中创建一个具有私有getter(或只是没有)但具有公共setter的属性? 不能使用错误: 在我的例子中,原因是Java Interop:我希望我的Java代码能够调用,但不能调用。

  • 我正在尝试使用bytebuddy拦截和访问。我已经阅读了网站上相当全面的文档,但据我所知,它涵盖了向字段添加getter和setter,而不是拦截字段访问。 以下是我想做的: 在这两种情况下,我都在尝试在字段访问之前/之后调用一些方法(或插入一些字节码)。我正在考虑使用来做到这一点,但我无法找到一种方法将其用于方法以外的东西。 编辑: 我正在使用Java代理来做这件事。我想添加一个来复制对象引用,

  • 请查看这段编译良好的代码: