Java Kotlin:只有getter的私有可变属性
我对Kotlin非常陌生,并且尝试将一个项目从Java迁移到它。我对Kotlin的属性和它们的getter/setter以及可见性范围有点困惑 我想要实现的是: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++; } } 因此,基本上我
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。