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, потому что это будет такая опрятная функция.