kotlin之get、set和field

文章讲述了在Kotlin中如何使用私有修饰符修饰setter,以及为何需要自定义getter和setter。通过示例展示了field属性在防止无限循环赋值导致内存溢出中的作用,强调了Kotlin为简化代码和优雅性所做的设计。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值