Kotlin ha delegato proprietà che è una funzionalità molto bella. Ma a volte i metodi get()
e set()
non sono sufficienti. Diciamo che voglio creare pigramente un oggetto Closeable
e chiuderlo in seguito. Ecco un esempio di come tali beni delegato potrebbe essere implementato:Accesso delegato proprietà in Kotlin
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()
}
}
ed è così che vorrei usarlo:
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
}
Sfortunatamente, questo approccio non funziona perché sembra che Kotlin doesn Permettere di accedere direttamente ai delegati di proprietà. C'è un modo per fare ciò che voglio? O ci sono piani per aggiungere tale funzionalità a Kotlin perché sarebbe una caratteristica così bella.
Tra l'altro, non è necessario l'invito a lasciare. Basta usare il valore? .close() –
@cypressious, hai ragione, grazie. – Michael