我尝试设置属性值,如下面的代码段所示。这个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类的值而不是第一行?
答案 0 :(得分:8)
首先,private
修饰符是你的问题。
更改
private set(value){field = value}
到
set(value){field = value}
//public by default
否则你不能在课外使用setter。阅读here。
对于在类中声明的成员: 私有表示仅在此类中可见(包括其所有成员);
其次,你误解了一些事情:
var kon = person.someProperty
kon = "manulilated"
在这些行中,您不会更改对象中的属性。创建变量kon
后,作为String
指向someProperty
,您将该局部变量重新分配给其他变量。此重新分配不等于更改 person.someProperty
的值!它对物体完全没有影响。
答案 1 :(得分:3)
someProperty
有私人二传手。当setter是私有的时,你不能在课外设置它