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

Kotlin:只有 getter 的私有可变属性

郭琦
2023-03-14

我对Kotlin很陌生,并试图将一个项目从Java迁移到它。我对Kotlin的属性和它们的getters/setter以及可见性范围有点困惑。

我想要实现的是:

public class Foo {

    private int number;

    public int getNumber() {
        return number;
    }

    public void increment() {
        number++;
    }

}

所以基本上我需要创建一个具有私有属性的类。此属性应由公共 getter 访问,但它不应具有 setter。此外,此属性应该是内部可变的,以便可以使用某种方法(如 increment())更改其值。

据我所知,我不能将其声明为val,因为在这种情况下,它将是完全不可变的,即使在类的实例中也是如此,所以我不能将其递增。看起来它应该是var。但是我没有看到将属性本身设为私有并且该属性的getter设为public的选项,因为似乎属性及其getter/setter应该具有相同的可见性范围......

共有3个答案

陆展
2023-03-14

在 Kotlin 中,您的类将如下所示:

class Foo {
    var number = 0
        get
        private set

    fun increment() {
        number++
    }
}

Getter是公共的(但无论如何,它是像这样隐式创建的,所以实际上我们可以删除它),而setter是私有的。

薛烨
2023-03-14

我也是科特林的新手,似乎是这样做的:

class Foo {
    var number: Int = 0; private set
    fun increment() {
       ++number;
    }
}

如其文件中所述

钱展
2023-03-14

如果您使用Intellij,您只需将代码粘贴到静态编程语言类中,就会收到以下内容:

class Foo {

  var number: Int = 0
    private set

  fun increment() {
    number++
  }
}

这基本上也是你问题的答案...

私有集告诉 setter 仅在私有下可见。因此,您可以在Foo中访问它,但不能从外部访问它。显式设置的 0(与 Java 相反)。然后:默认情况下,属性和函数是公共的

还要检查关于属性的Kotlin参考(特别是getter/setter)

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

  • 我希望我的类有一个字段,该字段返回所有公共访问的不可变列表,但在对象实例中,我希望列表是可变的,以便我可以向其添加元素。 我试过了,但不确定这是否被视为良好做法?

  • 如何使用自定义setter声明属性,但在Kotlin中没有getter?例如,在安科,他们这样做: 但在我看来,这有点骇人。这样做对吗?如果是,那么当一个项目没有Anko依赖关系时,情况会怎样呢? 附言:让我说清楚——我想没有吸气剂,而不是私人吸气剂

  • 我在kotlin中初始化了一些私有Int变量。 我的问题是,当我旋转手机时,会创建一个新的is活动,在当前代码中,分数被分配为0。是否有任何方法可以只初始化一次?出路是什么? 我在使用分数创建内部有一些计算。由于 onRestoreInstanceState 是在 onCreate 之后执行的,除了在 onStart 中定义分数之外,有没有办法保持分数值在屏幕旋转时不受影响?

  • 问题内容: 长话短说:我需要使用PHP风格的getter,但要使用JavaScript。 我的JavaScript仅在Firefox中运行,因此我可以使用Mozilla特定的JS。 我能找到的制作JS吸气剂的唯一方法是指定其名称,但我想为所有可能的名称定义一个吸气剂。我不确定这是否可行,但我非常想知道。 问题答案: 可以做到!我很高兴这个存在!这里给出一个答案:是否有与python的__getat

  • 因此,我试图用Kotlin开发一个Android应用程序,作为纸笔RPG伴侣。现在我想创造一个暴民阶层 在另一个活动中,我想显示以下信息: Android studio不断告诉我不能访问“名称”:尽管它在“Mob”中是私有的。我以为这就是我得到< code>get()的原因? 也许有更多静态编程语言经验的人可以帮忙。提前谢谢你。