我试着设置一个属性值,如下面的代码片段所示。这个SO question没有回答这个问题。
var person = Person("john", 24)
//sample_text.text = person.getName() + person.getAge()
var kon = person.someProperty
person.someProperty = "crap" //this doesn't allow me to set value
kon = "manulilated" //this allows me to set the value
sample_text.text = kon
class Person(val n: String, val a: Int){
var pname: String = n
var page: Int = a
var someProperty: String = "defaultValue"
get() = field.capitalize()
private set(value){field = value}
fun Init(nm: String, ag: Int){
pname = nm
page = ag
}
fun getAge(): Int{
return page
}
fun getName(): String{
return pname
}
}
为什么我可以在第二行设置Person类的值,而不能在第一行设置?
3条答案
按热度按时间o75abkj41#
首先,
private
修饰符是您的问题。变更
至
否则你不能在课堂之外使用setter。阅读这里。
对于在类中声明的成员:private表示仅在该类内部可见(包括其所有成员);
其次,你误解了一些东西:
在这几行中,你并没有改变对象的属性,在创建变量
kon
之后,作为一个指向someProperty
的String
,你将这个局部变量重新赋值给其他变量,这个赋值 * 不等于改变 *person.someProperty
的值!它对对象完全没有影响。vc9ivgsu2#
someProperty
具有私有setter。当setter为私有时,不能在类外对其进行设置krcsximq3#
这是一个尝试用Java风格编写Kotlin的好例子。
这是如何在Kotlin促进语言能力。人们可以看到有多少更短和更清楚的代码。个人类只有3行。
使用数据类使我们不必定义hash、equals和toString。
这就是结果: