属性委托给另外一个属性
从 Kotlin 1.4 开始,一个属性可以把它的 getter 与 setter 委托给另一个属性。这种委托对于顶层和类的属性(成员和扩展)都可用。
属性委托属性需要使用::限定符,例如,this::delegate
或 MyClass::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