में संपत्ति संपत्ति प्रतिनिधि का उपयोग करें कोटलिन ने संपत्तियों का प्रतिनिधित्व किया है जो एक बहुत अच्छी सुविधा है। लेकिन कभी-कभी 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 नहीं करता है संपत्ति प्रतिनिधियों तक सीधे पहुंचने की अनुमति नहीं है। क्या मैं चाहता हूं कि ऐसा करने का कोई तरीका है? या क्या कोटलिन को ऐसी कार्यक्षमता जोड़ने की कोई योजना है क्योंकि यह एक साफ सुविधा होगी।
वैसे, आप यह बताने के लिए कॉल की जरूरत नहीं है। बस मूल्य का उपयोग करें? .close() –
@cypressious, आप सही हैं, धन्यवाद। – Michael