Kotlin学习笔记-属性与字段详解

一、Getter()与Setter()

class Test{
    
    /*
     * getter 和 setter是可选的
     */
    
    // 当用var修饰时,必须为属性赋默认值(特指基本数据类型,因为自定义的类型可以使用后期初始化属性) 即使在用getter()的情况下,不过这样写出来,不管我们怎么去改变其值,其值都为`123`
    var test1 : String = ""
        get() = "123"
        set(value){field = value}
    
    // 用val修饰时,用getter()函数时,属性可以不赋默认值。但是不能有setter()函数。
    val test2 : String  
        get() = "123"       // 等价于:val test2 : String = "123"
}

在上面的代码中出现了set(value){field = value}这样的一句代码。其中value是Koltin写setter()函数时其参数的约定俗成的习惯。你也可以换成其他的值。而field是指属性本身。

2.1、自定义

例1:用val修饰的属性自定义情况

class Mime{
    // size属性
    private val size = 0    
    
    // 即isEmpty这个属性,是判断该类的size属性是否等于0
    val isEmpty : Boolean
        get() = this.size == 0

    // 另一个例子
    val num = 2
        get() = if (field > 5) 10 else 0
}

// 测试
fun main(args: Array) {
    val mime = Mime()
    println("isEmpty = ${mime.isEmpty}")
    println("num = ${mime.num}")
}
//输出结果为:
isEmpty = true
num = 0

例2:用var修饰的属性自定义情况

class Mime{

    var str1 = "test"
        get() = field   // 这句可以省略,kotlin默认实现的方式
        set(value){
            field = if (value.isNotEmpty()) value else "null"
        }

    var str2 = ""
        get() = "随意怎么修改都不会改变"
        set(value){
            field = if (value.isNotEmpty()) value else "null"
        }
}

// 测试
fun main(args: Array) {
    val mime = Mime()
    
    println("str = ${mime.str1}")
    mime.str1 = ""
    println("str = ${mime.str1}")
    mime.str1 = "kotlin"
    println("str = ${mime.str1}")

    println("str = ${mime.str2}")
    mime.str2 = ""
    println("str = ${mime.str2}")
    mime.str2 = "kotlin"
    println("str = ${mime.str2}")
} 

输出结果为

str = test
str = null
str = kotlin
str = 随意怎么修改都不会改变
str = 随意怎么修改都不会改变
str = 随意怎么修改都不会改变

你可能感兴趣的:(Kotlin学习笔记-属性与字段详解)