一分钟学习委托–增补篇

图像 171.png

属性委托给另外一个属性

从 Kotlin 1.4 开始,一个属性可以把它的 getter 与 setter 委托给另一个属性。这种委托对于顶层和类的属性(成员和扩展)都可用。

属性委托属性需要使用::限定符,例如,this::delegateMyClass::delegate

class MyClass(var memberInt: Int, val anotherClassInstance: ClassWithDelegate) {
    var delegatedToMember: Int by this::memberInt
    var delegatedToTopLevel: Int by ::topLevelInt
    
    val delegatedToAnotherClass: Int by anotherClassInstance::anotherClassInt
}
var MyClass.extDelegated: Int by ::topLevelInt
复制代码

当想要以一种向后兼容的方式重命名一个属性的时候:引入一个新的属性、 使用 @Deprecated 注解来注解旧的属性、并委托其实现。

class MyClass {
   var newName: Int = 0
   @Deprecated("Use 'newName' instead", ReplaceWith("newName"))
   var oldName: Int by this::newName
}

fun main() {
   val myClass = MyClass()
   // 通知:'oldName: Int' is deprecated.
   // Use 'newName' instead
   myClass.oldName = 42
   println(myClass.newName) // 42
}
复制代码

将属性存储在map中

class User(val map: Map<String, Any?>) {
    val name: String by map
    val age: Int     by map
}
//构造函数也接受一个映射
val user = User(mapOf(
    "name" to "John Doe",
    "age"  to 25
))
复制代码

局部委托

可以将局部变量声明为委托属性。

fun example(computeFoo: () -> Foo) {
    val memoizedFoo by lazy(computeFoo)

    if (someCondition && memoizedFoo.isValid()) {
        memoizedFoo.doSomething()
    }
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享