kotlin之get、set和field

私有修饰符修饰 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就可以避免这个问题。

猜你喜欢

转载自blog.csdn.net/qq_55888300/article/details/130454728
今日推荐