私有修饰符修饰 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就可以避免这个问题。
————————————————
版权声明:本文为CSDN博主「才疏学浅,努力修炼」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_55888300/article/details/130454728

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐