यह जावा 9 के साथ होना चाहिए! इसके बजाय का
उपयोग करें java.util.Cleaner
! (या sun.misc.Cleaner
पुराने JRE पर)
मूल पोस्ट:
मैंने पाया कि PhantomReferences के उपयोग में अंतिम विधियों के रूप में लगभग समान ही नुकसान होते हैं (लेकिन एक बार ठीक होने के बाद कम समस्याएं)। मैंने Java 8 के लिए एक छोटा सा समाधान (PhantomReferences का उपयोग करने के लिए एक बहुत छोटा ढांचा) लिखा है। यह ऑब्जेक्ट को हटाए जाने के बाद कॉलबैक के रूप में लैम्बडा एक्सप्रेशन का उपयोग करने की अनुमति देता है। आप आंतरिक संसाधनों के लिए कॉलबैक पंजीकृत कर सकते हैं जिन्हें बंद किया जाना चाहिए। इसके साथ मुझे एक समाधान मिला है जो मेरे लिए काम करता है क्योंकि यह इसे और अधिक व्यावहारिक बनाता है।
https://github.com/claudemartin/java-cleanup
यहां एक छोटा उदाहरण दिखाया गया है कि कॉलबैक कैसे पंजीकृत होता है:
class Foo implements Cleanup {
public Foo() {
this.registerCleanup((value) -> {
try {
value.close();
} catch (Exception e) {
logger.warning("closing resource failed", e);
}
}, this.resource);
}
और फिर ऑटो-क्लोज़ के लिए और भी सरल तरीका है, जो ऊपर के समान ही कर रहा है:
this.registerAutoClose(this.resource);
अपने सवालों के जवाब देने के लिए:
[फिर इसका क्या उपयोग है]
आप किसी ऐसी चीज़ को साफ़ नहीं कर सकते जो मौजूद नहीं है। लेकिन इसके पास ऐसे संसाधन हो सकते हैं जो अभी भी मौजूद हैं और उन्हें साफ करने की आवश्यकता है ताकि उन्हें हटाया जा सके।
लेकिन इस अवधारणा / वर्ग का उपयोग क्या है?
डिबगिंग / लॉगिंग के अलावा किसी भी प्रभाव के साथ कुछ भी करना जरूरी नहीं है। या शायद आँकड़ों के लिए। मैं इसे जीसी से एक अधिसूचना सेवा की तरह अधिक देखता हूं। आप ऑब्जेक्ट को हटाए जाने के बाद अप्रासंगिक हो जाने वाले एकत्रित डेटा को निकालने के लिए भी इसका उपयोग करना चाहते हैं (लेकिन शायद इसके लिए बेहतर समाधान हैं)। उदाहरण अक्सर डेटाबेस कनेक्शन को बंद करने का उल्लेख करते हैं, लेकिन मैं यह नहीं देखता कि यह इतना अच्छा विचार कैसे है क्योंकि आप लेनदेन के साथ काम नहीं कर सकते। एक एप्लीकेशन फ्रेमवर्क इसके लिए एक बेहतर समाधान प्रदान करेगा।
क्या आपने कभी अपने किसी प्रोजेक्ट में इसका उपयोग किया है, या क्या आपके पास कोई उदाहरण है जहां हमें इसका उपयोग करना चाहिए? या यह अवधारणा सिर्फ साक्षात्कार बिंदु के लिए बनाई गई है;)
मैं इसका इस्तेमाल ज्यादातर सिर्फ लॉगिंग के लिए करता हूं। इसलिए मैं हटाए गए तत्वों का पता लगा सकता हूं और देख सकता हूं कि जीसी कैसे काम करता है और इसे ट्विक किया जा सकता है। मैं इस तरह से कोई महत्वपूर्ण कोड नहीं चलाऊंगा। यदि किसी चीज़ को बंद करने की आवश्यकता है, तो इसे एक कोशिश के साथ-संसाधन-कथन में किया जाना चाहिए। और मैं इसे यूनिट परीक्षणों में उपयोग करता हूं, यह सुनिश्चित करने के लिए कि मेरे पास कोई मेमोरी लीक नहीं है। ठीक उसी तरह जिस तरह से जोंतेज करता है। लेकिन मेरा समाधान थोड़ा और सामान्य है।