私有修饰符修饰 Set
默认的 getter 和 setter 有一个 public 修饰符。如果我们想通过使用 private
关键字来使用带有 private 修饰符的 setter,需要声明一个私有的 setter,我们只能通过类中的一个方法来设置这个值。
class Student () {
var Name: String = "John Doe"
private set
fun randFunc(n: String) {
Name = n
}
}
fun main(args: Array<String>) {
var s = Student()
println("Initially, name of the student is: ${s.Name}")
s.randFunc("Jane Doe")
println("Now, name of the student is: ${s.Name}")
}
自定义 Getter 和 Setter
class Student{
var Name: String = ""
get() {
println("We are in Name property's get()")
return field.toString()
}
set(defaultValue) {
println("We are in Name property's set()")
field = defaultValue
}
val ID: Int = 1013
get(){
println("We are in ID property's get()")
return field
}
}
fun main() {
val stu = Student()
stu.Name = "John Doe"
println("The age of ${stu.Name} is ${stu.ID}")
}
可以看出指代的就是get和set函数当前声明的属性参数。
field属性
kotlin的get和set引入了field属性,在创建实体类时,自动生成,用以替代属性名称。
class Student {
var Name: String = "John"
get() = field
set(value) {
field = value
}
}
由于getter()和setter()是自动生成的,一般不需要去添加,但是需要自定义返回结果时,需要注意,不能使用属性的名称,而是使用field来替代原有的类属性。
为何要如此呢?
由于kotlin参考js的语法糖格式,目的在于简化代码,使得代码更简洁优雅,但是会带来一些问题,这个问题在js中同样存在,从因此采取了js一样的解决方式,就是field属性。这个问题就出在set
方法上,通过主函数中s.name = jack的方式就能对变量进行赋值,我们可以看下如果没有field属性应该怎么写
class Student{
var name: String = "John"
get() = name
set(name) {
this.name = name//1
}
}
fun main() {
val s=Student()
s.name="Jack"
}
关键点就在于注释1中this.name = name又进行了set操作,就会无限循环调用set,最后造成内存溢出,而使用field就可以避免这个问题。