Kotlin委托和属性委托

Kotlin委托和属性委托

2024-06-24
编程开发

委托

// 定义接口
interface Printer {
    fun print(message: String)
}

// 实现接口的具体类
class ConsolePrinter : Printer {
    override fun print(message: String) {
        println("Printing message: $message")
    }
}

// 委托类
class Delegate(private val printer: Printer) : Printer by printer {
    // 可以添加自己的额外逻辑或方法
    fun doAdditionalTask() {
        println("Performing additional task")
    }
}

// 测试代码
fun main() {
    // 创建委托类的实例,并传入具体的打印机对象
    val printer = ConsolePrinter()
    val delegate = Delegate(printer)

    // 调用委托类的方法,实际上会委托给打印机对象执行打印任务
    delegate.print("Hello, World!")

    // 委托类可以调用自己的方法
    delegate.doAdditionalTask()
}

拆解

// 第一步
class Delegate(private val printer: Printer) {
   // do sth
}

//第二步,实现接口
class Delegate(private val printer: Printer) : Printer {
   // do sth
}

//第三步,对象委托
class Delegate(private val printer: Printer) : Printer by printer {
   // do sth
}

从效果上看,kotlin中的委托就是去实现接口,但是具体的实现方法交给其他对象。好处:继承的一个很好的替代方式,较少样板代码的书写

属性委托

语法:val/var <属性名>: <类型> by <表达式>

在 by 后面的表达式是该 委托, 因为属性对应的 get()(与 set())会被委托给它的 getValue() 与 setValue() 方法。 属性的委托不必实现接口,但是需要提供一个 getValue() 函数(对于 var 属性还有 setValue())

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, thank you for delegating '${property.name}' to me!"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$value has been assigned to '${property.name}' in $thisRef.")
    }
}

标准委托 - lazy

构造方法

// 默认线程安全,内部的原理是synchronize实现的懒汉模式
public actual fun <T> lazy(initializer: () -> T): Lazy<T> = SynchronizedLazyImpl(initializer)

// 也可以指定模式
public actual fun <T> lazy(mode: LazyThreadSafetyMode, initializer: () -> T): Lazy<T> =
    when (mode) {
        LazyThreadSafetyMode.SYNCHRONIZED -> SynchronizedLazyImpl(initializer)
        LazyThreadSafetyMode.PUBLICATION -> SafePublicationLazyImpl(initializer)
        LazyThreadSafetyMode.NONE -> UnsafeLazyImpl(initializer)
    }
THE END
0/500
暂无评论