2017-05-04 8 views
8

आज मैं कोटलिन में Closeable लागू कर रहा हूं, और जैसा कि मैंने अतीत में जावा में किया है, मैं finalize() को अंतिम रिसॉर्ट फ़ॉलबैक के रूप में कार्यान्वित करना चाहता हूं, यदि क्लाइंट कोड इसे बंद करना भूल जाता है, तो महत्वपूर्ण संसाधन को पुनः प्राप्त नहीं किया जाता है । मैं इस फॉलबैक की अविश्वसनीयता के बावजूद इस फॉलबैक को जोड़ने के लिए पर्याप्त संसाधन को समझता हूं। हालांकि, kotlin.Any एक finalize प्रणाली की घोषणा नहीं करता है, जिसका मतलब है कि मैं इस simplydo नहीं कर सकते हैं:कोटलिन में अंतिम रूप() को कार्यान्वित करने के लिए कैसे करें?

class Resource: Closeable { 
    fun close() {} 
    override fun finalize() { close()} 
} 

यह अच्छा नहीं है, कम से कम नहीं के रूप में अच्छा के रूप में यह होना चाहिए। अब मैं एक वर्कअराउंड के रूप में सादे जावा पर वापस आ गया। क्या कोई जानता है कि शुद्ध कोटलिन में यह कैसे करें?

पुनश्च: मेरे वर्तमान वैकल्पिक हल:

FinalizedCloseable.java:

public abstract class FinalizedCloseable implement Closeable { 
    @Override protected void finalize() { close(); } 
} 

Kotlin:

class Resource: FinalizedCloseable(), Closeable { 
    fun close() {} 
    override fun finalize() { close()} 
} 

लेकिन इस समाधान का एक सुपर क्लास की आवश्यकता है। अगर अगली बार मेरे अन्य Resource को पहले से ही सुपरक्लस मिला है, तो यह कामकाज बहुत सारे बॉयलरप्लेट के बिना काम नहीं करेगा।


संपादित करें: अब मैं) कैसे को अंतिम रूप देने (लागू करने के लिए पता है, लेकिन प्लगइन kotlin आईडिया बहुत चालाक को पता है कि यह एक finalizer है नहीं है और इस तरह कुछ चेतावनी के साथ में चिह्नित करें। थोड़ी देर के लिए संघर्ष करने के बाद मैंने पाया इन चेतावनियों को दबाने के लिए कैसे, और मैं इसे साझा करना चाहते हैं:

class C { 
    @Suppress("ProtectedInFinal", "Unused") protected fun finalize() {} 
} 
+1

https://kotlinlang.org/docs/reference/java- interop.html # अंतिम – ean5533

+0

@ ean5533 उह मैंने इसे लंबे इंटरऑप दस्तावेज़ को पूरी तरह से नहीं पढ़ा, और अब मेरी सजा है। वैसे भी धन्यवाद। – glee8e

+0

क्या आपने जावा 8 में दृढ़ता से पहुंचने योग्य वस्तु पर "अंतिमकरण() को पढ़ा है [https://stackoverflow.com/q/26642153/2711488)"? नीचे की रेखा है, आपको यह बिल्कुल बेहतर नहीं करना चाहिए। जब तक आपके कोड में 'मूल' कोड सीधे सिस्टम संसाधन से संबंधित नहीं होता है, तो आपकी कक्षा वास्तव में संसाधन का प्रतिनिधित्व करने वाली दूसरी वस्तु के चारों ओर एक रैपर होगी और रैपर की पहुंच क्षमता को वास्तविक संसाधन का जीवन समय निर्धारित करने के लिए (जो अभी भी पहुंच योग्य हो सकता है) उपयोग में), मतलब गंभीर समस्याओं के लिए पूछना है ... – Holger

उत्तर

12

official documentation इस शामिल किया गया।

को अंतिम रूप देने ओवरराइड करने के लिए(), तुम सब करने की जरूरत है बस इसे घोषित किया जाता है, ओवरराइड कीवर्ड का उपयोग किए बिना:

class C { 
    protected fun finalize() { 
     // finalization logic 
    } 
} 
+0

सेकंड्स द्वारा इसे मारो :) – ean5533

+0

धन्यवाद! मुझे यही सब चाहिए! लेकिन 12 मिनट पहले चिपकने से पहले stackoverflow anwser का चयन क्यों प्रतिबंधित करता है ... – glee8e

संबंधित मुद्दे

 संबंधित मुद्दे