Kotlin委托、by lazy以及lateinit简介

一、Kotlin委托简介

委托模式就是一个对象接收了一条消息,但是自己不处理,转交给别的对象处理。在Kotlin里面通过by关键字直接支持委托模式。

1.1 类委托

类委托就是将一个类接收到消息后,调用另一个类的方法来执行。

interface Animal {
    fun walk()
}

class Duck : Animal {
    override fun walk() {
        println("鸭子摇摆走")
    }
}

class BlackDuck(animal: Animal) : Animal by animal

fun main() {
    val blackDuck = BlackDuck(Duck())
    blackDuck.walk()
}

在上面的这个例子中,BlackDuck类实现Animal接口,编译器会生成这个接口的方法,并且在对象内部保存animal变量。通过by关键字实现委托,BlackDuck的方法将调用animal变量中的方法。

1.2 属性委托

属性委托应该是我们最常见到的委托,by lazy即是一个属性委托。
属性委托的格式:

val/var <属性名>: <类型> by <表达式>
class Furniture {
    var category: String by CategoryDelegate()
}

class CategoryDelegate {
    operator fun getValue(ref: Any?, property: KProperty<*>): String {
        return "haha"
    }

    operator fun setValue(ref: Any?, property: KProperty<*>, value: String) {
        println("$ref${property.name} 属性赋值为 $value")
    }
}

fun main() {
    val furniture = Furniture()
    furniture.category = "Desk"
    println(furniture.category)
}

by关键字之后是一个表达式,这个表达式要返回一个委托对象,这个委托对象的类必须要有getValue方法,如果是var变量还必须要有setValue方法。
ref是属性所有者对象,这里即是Furniture对象。
property必须是类型 KProperty<*> 或其超类型
getValue方法的返回值和setValue方法的value参数都必须是委托属性的类型,这里即是String类型。

二、by lazy和lateinit

by lazylateinit都是Kotlin中的延迟属性初始化方案。by lazy只能用于val常量,lateinit只能应用于var变量,而var的基本类型(Long, Int, Float等)只能用Delegates.notNull()val的基本类型还是用by lazy

2.1 by lazy

lazy是一个函数,它接收一个lamda表达式作为参数,返回一个Lazy< T >对象。在没有设置mode的情况下,默认返回SynchronizedLazyImpl对象,当调用get方法时,会去调用lamda表达式,并且将lamda表达式的值作为返回值。

private val name: String by lazy { 
    println("test") 
    "Duck"
}

2.2 lateinit

private lateinit var category: String

2.3 基本类型变量延迟初始化

private var age: Int by Delegates.notNull()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值