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

Java Kotlin:只有getter的私有可变属性,java,kotlin,Java,Kotlin,我对Kotlin非常陌生,并且尝试将一个项目从Java迁移到它。我对Kotlin的属性和它们的getter/setter以及可见性范围有点困惑 我想要实现的是: public class Foo { private int number; public int getNumber() { return number; } public void increment() { number++; } } 因此,基本上我

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

我想要实现的是:

public class Foo {

    private int number;

    public int getNumber() {
        return number;
    }

    public void increment() {
        number++;
    }

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


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

如果使用Intellij,您可以将代码粘贴到Kotlin类中,并将收到以下信息:

class Foo {

  var number: Int = 0
    private set

  fun increment() {
    number++
  }
}
这基本上也是你问题的答案

private set
表明setter仅在私下可见。因此,您可以在
Foo
中访问它,但不能从外部访问。显式设置的
0
(与Java相反)。然后:默认情况下,属性和函数为
public


同时检查一下

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

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

在科特林,你的课堂将会是这样的:

class Foo {
    var number = 0
        get
        private set

    fun increment() {
        number++
    }
}

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

谢谢。我正试图反之亦然:声明了一个具有
private
作用域的字段和一个具有
public
作用域的getter(就像我们在Java中通常做的那样),并得到了错误
getter可见性必须与属性可见性相同。这使我感到困惑。但是,是的,它的工作方式正好相反。好吧,您还可以做以下工作:
private var number:Int=0
fun getNumber()=number
。但是,这不是标准的Kotlin方式;-)这样,您可以根据自己的喜好命名该方法。。。你甚至可以归还其他东西,然后归还财产。。。(但是!)在这里坚持标准肯定更好:-)是的,我有这个想法,但决定要一种“科特林方式”。再次感谢。很抱歉在评论中提出讨论,但是是否可以使用主构造函数声明相同的属性,以便我可以利用
data
关键字(使
Foo
成为一个数据类,但不使用setter)?否。。。您不能在构造函数中设置
私有集
。也检查一下这个。在这种特定情况下,您可能更希望提供如下内容:
数据类(私有变量编号:Int){fun currentCount()=number}
。。。也许将来构造函数中也会支持私有setter/getter。