【发布时间】:2015-09-02 23:13:29
【问题描述】:
Kotlin 具有委托属性,这是一个非常好的特性。但有时get() 和set() 方法还不够。假设我想懒惰地创建一个Closeable 对象并稍后关闭它。以下是如何实现此类委托属性的示例:
fun <T : Closeable> closeableLazy(initializer: () -> T) =
CloseableLazyVal(initializer)
class CloseableLazyVal<T : Closeable>(
private val initializer: () -> T
) : ReadOnlyProperty<Any?, T> {
private var value: T? = null
override fun get(thisRef: Any?, desc: PropertyMetadata): T {
if (value == null) {
value = initializer()
}
return value
}
fun close() {
value?.close()
}
}
这就是我想使用它的方式:
private val stream by closeableLazy { FileOutputStream("/path/to/file") }
fun writeBytes(bytes: ByteArray) {
stream.write(bytes)
}
override fun close() {
stream::delegate.close() // This line will not compile
}
不幸的是,这种方法不起作用,因为 Kotlin 似乎不允许直接访问属性委托。有什么办法可以做我想做的事吗?或者是否有任何计划将此类功能添加到 Kotlin,因为它会是一个非常简洁的功能。
【问题讨论】:
-
顺便说一句,你不需要调用 let。只需使用 value?.close()
-
@cypressious,你是对的,谢谢。
标签: properties delegates kotlin