दिलचस्प पोस्ट
स्विंगवार्कर के निष्पादन को कैसे रद्द करें? SQL Server 2005 टी-एसक्यूएल में बेस 64 एन्कोडिंग आईओएस सिम्युलेटर गेम्स बहुत धीमे (कम एफपीएस) चलाते हैं क्या आईएस नाल और = नल के बीच कोई अंतर है? उद्देश्य सी में एक सार वर्ग बनाना टाइप वैरिएबल का प्रयोग करके एक चर कास्टिंग करना जावा में सूचियों की सूची के साथ कार्य करना मावेन युद्ध निर्भरता आईफोन के इस्तेमाल के लिए एक एसक्यूएलआईटी डीबी में छवियों को पढ़ना और लिखना फोनगैप कैमरा एप्लिकेशन को पुनरारंभ करता है शब्दों और विराम चिह्नों में एक स्ट्रिंग को विभाजित करना माउसओवर टूलटिप वाला मल्टीर्सरीज़ लाइन चार्ट मैं कैसे जांचूं अगर फ़ाइल jQuery या शुद्ध जावास्क्रिप्ट में मौजूद है? कैसे सूची दृश्य के साथ स्वत: पूर्णतथाविवरण देखें? मैं एक पहले से खोला हुआ फ़ाइल कैसे खोलता हूं, जो कि नेट स्ट्रीम रीडर के साथ है?

क्या जावा के लिए एक डिस्ट्रक्टर है?

क्या जावा के लिए एक डिस्ट्रक्टर है? मुझे इस पर कोई दस्तावेज नहीं मिल रहा है। अगर नहीं है, तो मैं एक ही प्रभाव कैसे प्राप्त कर सकता हूं?

मेरा प्रश्न अधिक विशिष्ट बनाने के लिए, मैं एक आवेदन लिख रहा हूं जो डेटा के साथ काम करता है, और विनिर्देशन का कहना है कि एक 'रीसेट' बटन होना चाहिए जो आवेदन को अपने मूल लॉन्च किए गए राज्य में वापस लाता है। हालांकि, सभी डेटा को 'लाइव' होना चाहिए, जब तक कि एप्लिकेशन बंद नहीं होता है या रीसेट बटन दबाया जाता है।

आम तौर पर सी / सी ++ प्रोग्रामर होने के नाते, मैंने सोचा था कि यह लागू करने के लिए तुच्छ हो जाएगा। (और इसलिए मैंने इसे अंतिम रूप से कार्यान्वित करने की योजना बनाई थी।) मैंने अपने कार्यक्रम को संरचित किया है कि सभी रीसेट-सक्षम ऑब्जेक्ट्स एक ही कक्षा में होंगी ताकि रीसेट बटन दबाए जाने पर मैं सभी 'लाइव' ऑब्जेक्ट को नष्ट कर सकूं।

मैं सोच रहा था कि यदि मैंने किया था, तो सभी डेटा को हटाना और कचरा कलेक्टर को इकट्ठा करने के लिए इंतजार करना था, क्या मेरे उपयोगकर्ता बार-बार डेटा दर्ज करने और रीसेट बटन दबाएगा, तो स्मृति रिसाव नहीं होगा? मैं भी सोच रहा था, क्योंकि जावा एक भाषा के रूप में काफी परिपक्व है, इसे रोकने या इसने गर्व से निपटने का एक तरीका होना चाहिए

वेब के समाधान से एकत्रित समाधान "क्या जावा के लिए एक डिस्ट्रक्टर है?"

क्योंकि जावा एक कचरा एकत्रित भाषा है, जिसका अनुमान नहीं लगाया जा सकता है कि कब (या यहां तक ​​कि) कोई वस्तु नष्ट हो जाएगी। इसलिए एक नाशक के कोई सीधा समानता नहीं है

अंततः नामित एक विरासत विधि है, लेकिन इसे कचरा कलेक्टर के विवेक पर पूरी तरह से कहा जाता है। इसलिए उन वर्गों के लिए जो स्पष्ट रूप से साफ करने की जरूरत है, सम्मेलन एक करीबी विधि को परिभाषित करना है और केवल उन्माद की जांच के लिए अंतिम रूप से उपयोग करना है (यानी अगर इसे अभी नहीं कहा गया है और एक त्रुटि लॉग करते हैं)

एक सवाल था जो हाल ही में अंतिम रूप से चर्चा की गहन चर्चा पैदा करता है , ताकि आवश्यक होने पर अधिक गहराई देनी चाहिए …

नहीं, यहां कोई विध्वंस नहीं है। इसका कारण यह है कि सभी जावा ऑब्जेक्ट हीप आवंटित और कचरा एकत्र किए गए हैं। स्पष्ट deallocation (यानी सी ++ के डिलीट ऑपरेटर) के बिना वास्तविक नाशकों को लागू करने के लिए कोई समझदार तरीका नहीं है।

जावा फ़रिनेजर का समर्थन करता है, लेकिन इसका मतलब केवल मूल संसाधनों जैसे सॉकेट्स, फ़ाइल हैंडल, विंडो हैंडल आदि से जुड़े ऑब्जेक्ट्स के लिए सुरक्षा के लिए इस्तेमाल किया जाता है। जब कचरा कलेक्टर अंतिम रूप से बिना ऑब्जेक्ट एकत्र करता है तो यह केवल स्मृति क्षेत्र मुक्त है और यही है जब ऑब्जेक्ट को अंतिम रूप दिया जाता है, तो यह पहली बार एक अस्थायी स्थान (याद रखना, हम यहाँ कचरा इकट्ठा कर रहे हैं) में कॉपी किए गए हैं, फिर इसे प्रतीक्षा-से-अंतिम-अंतिम कतार में संलग्न किया गया है और फिर फ़ाइनलयर थ्रेड चुनाव कतार में बहुत कम प्राथमिकता के साथ और फ़ाइनलर चलाता है

जब आवेदन निकलता है, तो लंबित ऑब्जेक्ट को अंतिम रूप देने के इंतजार किए बिना जेवीएम बंद हो जाता है, इसलिए व्यावहारिक तौर पर यह कोई गारंटी नहीं है कि आपके अंतिम योजक कभी भी चलाएंगे।

यदि आप जावा 7 का उपयोग करते हैं, तो कोशिश-के-संसाधन- विवरण बयान देखें। उदाहरण के लिए:

 try (BufferedReader br = new BufferedReader(new FileReader(path))) { System.out.println(br.readLine()); } catch (Exception e) { ... } finally { ... } 

यहां संसाधन जो अब जरूरी नहीं है, उसे BufferedReader.close() विधि में मुक्त किया गया है। आप अपना स्वयं का वर्ग बना सकते हैं जो AutoCloseable लागू करता है और इसे उसी प्रकार से इस्तेमाल करता है।

यह कथन कोड संरचना के संदर्भ में finalize से अधिक सीमित है, लेकिन साथ ही यह समझने और बनाए रखने के लिए कोड को सरल बनाता है। इसके अलावा, इसमें कोई गारंटी नहीं है कि एप्लिकेशन के livetime के दौरान finalize एक finalize विधि को बुलाया जाता है।

अंतिम रूप से () तरीकों का इस्तेमाल करना टाल जाना चाहिए। वे संसाधन के लिए एक विश्वसनीय तंत्र नहीं हैं और कचरा कलेक्टर में उन्हें दुरुपयोग करके समस्याएं पैदा कर सकते हैं।

यदि आपको अपने ऑब्जेक्ट में एक deallocation कॉल की आवश्यकता होती है, संसाधनों को जारी रखने के लिए कहें, एक स्पष्ट विधि कॉल का उपयोग करें। इस सम्मेलन को मौजूदा एपीआई में देखा जा सकता है (उदाहरण के तौर पर बंद करने योग्य , ग्राफिक्स । डीज़ोज़ () ), विजेट। डीज़ोज़ () ) और आम तौर पर प्रयास / अंत में कहा जाता है।

 Resource r = new Resource(); try { //work } finally { r.dispose(); } 

किसी डिस्क्लेटेड ऑब्जेक्ट का उपयोग करने के प्रयास से रनटाइम अपवाद फेंकना चाहिए (देखें IllegalStateException )


संपादित करें:

मैं सोच रहा था कि यदि मैंने किया था, तो सभी डेटा को हटाना और कचरा कलेक्टर को इकट्ठा करने के लिए इंतजार करना था, क्या मेरे उपयोगकर्ता बार-बार डेटा दर्ज करने और रीसेट बटन दबाएगा, तो स्मृति रिसाव नहीं होगा?

आम तौर पर, आपको केवल ऑब्जेक्ट्स को डिरेफर करने की ज़रूरत है – कम से कम, यह वह काम है जिस तरह से काम करना चाहिए। यदि आप कचरा संग्रहण के बारे में चिंतित हैं, तो जावा एसई 6 हॉटस्पॉट [टीएम] आभासी मशीन कचरा संग्रह ट्यूनिंग (या अपने जेवीएम संस्करण के लिए समतुल्य दस्तावेज़) देखें।

जावा 1.7 के रिलीज़ होने के साथ, आपके पास अब try-with-resources ब्लॉक का उपयोग करने का अतिरिक्त विकल्प है। उदाहरण के लिए,

 public class Closeable implements AutoCloseable { @Override public void close() { System.out.println("closing..."); } public static void main(String[] args) { try (Closeable c = new Closeable()) { System.out.println("trying..."); throw new Exception("throwing..."); } catch (Exception e) { System.out.println("catching..."); } finally { System.out.println("finalizing..."); } } } 

यदि आप इस क्लास को निष्पादित करते हैं, तो c.close() को क्रियान्वित किया जाएगा जब try ब्लॉक छोड़ा गया है, और catch से पहले और finally ब्लॉक निष्पादित हो जाएंगे। finalize() विधि के मामले में विपरीत, निष्पादित होने के लिए close() की गारंटी है। हालांकि, finally खंड में इसे स्पष्ट रूप से निष्पादित करने की कोई आवश्यकता नहीं है।

मैं पूरी तरह से अन्य उत्तरों से सहमत हूं, कह रहा हूं कि अंतिम रूप देने के निष्पादन पर भरोसा न करना।

कोशिश-कैच-अंत में ब्लॉक के अलावा, आप अपने कार्यक्रम में अंतिम सफाई करने के लिए रनटाइम # addShutdownHook (जावा 1.6 में शुरू की गई) का उपयोग कर सकते हैं।

यह डिस्ट्रक्टर्स के समान नहीं है , लेकिन एक शटडाउन हुक को लागू कर सकता है जिसमें श्रोता ऑब्जेक्ट पंजीकृत होते हैं, जिस पर क्लीनअप विधि (बंद लगातार डेटाबेस कनेक्शन, फ़ाइल लॉक आदि) को लागू किया जा सकता है – जो सामान्य रूप से किया जाएगा डिस्ट्रक्टर्स दोबारा – यह कंसल्टेंट्स के लिए एक प्रतिस्थापन नहीं है, लेकिन कुछ मामलों में आप इसके साथ वांछित कार्यक्षमता तक पहुंच सकते हैं।

इस का लाभ आपके कार्यक्रम के बाकी हिस्सों से मिलकर डिस्कोन्स्ट्रक्शन बेविविएर लोजले है

नहीं, java.lang.Object#finalize आप निकटतम प्राप्त कर सकते हैं।

हालांकि, जब (और अगर) इसे कहा जाता है, गारंटी नहीं है।
देखें: java.lang.Runtime#runFinalizersOnExit(boolean)

सबसे पहले, ध्यान दें कि जावा कचरा एकत्रित होने के बाद से वस्तु विनाश के बारे में कुछ भी करने की आवश्यकता नहीं है। सबसे पहले क्योंकि आपके पास आमतौर पर मुफ्त में किसी भी प्रबंधित संसाधन नहीं होते हैं, और दूसरी बात क्योंकि आप भविष्यवाणी नहीं कर सकते हैं कि कब या ऐसा होगा, तो ऐसी चीजों के लिए अनुचित है जो आपको "होने की आवश्यकता है जैसे ही कोई भी मेरे ऑब्जेक्ट का उपयोग नहीं कर रहा है "।

एक वस्तु को java.lang.ref.PhantomReference (वास्तव में, यह कह रहा है कि इसे नष्ट कर दिया गया है, थोड़ा गलत हो सकता है) का उपयोग कर नष्ट कर दिया गया है, लेकिन अगर इसे एक प्रेत का संदर्भ कतारबद्ध है, तो इसे अधिसूचित किया जा सकता है, यह अब वसूली योग्य नहीं है, जो आमतौर पर वही चीज़)। एक आम उपयोग है:

  • अपने क्लास में संसाधन (एस) को अलग करें, जिसे किसी अन्य सहायक ऑब्जेक्ट में फेंकने की जरूरत है (ध्यान दें कि यदि आप कर रहे हैं तो कनेक्शन बंद हो रहा है, जो एक सामान्य मामला है, आपको एक नया वर्ग लिखने की आवश्यकता नहीं है: बंद करने के लिए कनेक्शन उस मामले में "सहायक वस्तु" होगा)।
  • जब आप अपना मुख्य ऑब्जेक्ट बनाते हैं, तो इसके लिए फ़ैंटम रेफरेंस भी बनाएं। या तो यह नई सहायक ऑब्जेक्ट को संदर्भित करता है, या फैंटमरेफरेंस ऑब्जेक्ट्स से संबंधित सहायक ऑब्जेक्ट्स के लिए मैप स्थापित करता है।
  • मुख्य ऑब्जेक्ट एकत्र किए जाने के बाद, फाँटमरेफरेंस कतारबद्ध है (या यह कतारबद्ध हो सकता है – जैसे कि फ़ाइनलर्स यहां कोई गारंटी नहीं है, ऐसा कभी नहीं होगा, उदाहरण के लिए यदि वीएम बाहर निकलता है तो यह इंतजार नहीं करेगा)। सुनिश्चित करें कि आप अपनी कतार (या तो एक विशेष थ्रेड में या समय-समय पर) को संसाधित कर रहे हैं सहायक ऑब्जेक्ट के लिए कठिन संदर्भ के कारण, सहायक ऑब्जेक्ट को अभी तक एकत्र नहीं किया गया है। तो सहायक सहायक को आप जो भी सफाई चाहते हैं, तो फिर फेंटम रेफरेंस को त्याग दें और सहायक अंततः भी एकत्र किया जाएगा।

वहाँ भी अंतिम रूप है (), जो एक नाशक जैसा दिखता है, लेकिन एक तरह से व्यवहार नहीं करता है यह आमतौर पर एक अच्छा विकल्प नहीं है

मुझे खेद है अगर यह मुख्य विषय से घूमता है, लेकिन जावा.उटील। टिमर (एसई 6) दस्तावेज़ीकरण कहता है:

"टाइमर ऑब्जेक्ट के अंतिम जीवित संदर्भ को समाप्त होने के बाद और सभी बकाया कार्य निष्पादन को पूरा कर लेते हैं, टाइमर का कार्य निष्पादन थ्रेड सुन्दरता से समाप्त होता है (और कचरा संग्रह के अधीन होता है)। हालांकि, यह अपरिहार्य रूप से लंबे समय तक हो सकता है। कार्य निष्पादन धागा एक डेमन थ्रेड के रूप में नहीं चला है, इसलिए यह एक आवेदन को समाप्त करने में सक्षम है। यदि कोई कॉलर टाइमर के कार्य निष्पादन धागा को तेजी से समाप्त करना चाहता है, तो कॉलर को टाइमर की रद्द करने की विधि का उपयोग करना चाहिए … "

मैं टाइमर के अपने अंतिम संदर्भ (या पहले immeditalesky) को खोने वाले वर्ग पर रद्द करना चाहता हूं यहाँ एक विश्वसनीय नाशक मेरे लिए ऐसा कर सकता है उपरोक्त टिप्पणियां इंगित करती हैं कि आखिरकार एक खराब विकल्प नहीं है, लेकिन क्या इसका एक शानदार समाधान है? "… को समाप्त करने से एक आवेदन रखने में सक्षम … का व्यवसाय" आकर्षक नहीं है।

अगर यह सिर्फ स्मृति है, तो आप चिंतित हैं, नहीं। बस जीसी पर भरोसा है यह एक अच्छा काम करता है मैंने वास्तव में इस बारे में बहुत कुछ देखा है कि कुछ उदाहरणों में बड़े ऑरेंजों का उपयोग करने की तुलना में छोटे ऑब्जेक्ट्स के ढेर बनाने के लिए प्रदर्शन बेहतर हो सकता है।

मैं अधिकांश उत्तरों से सहमत हूं

आपको पूरी तरह या तो finalize या ShutdownHook पर निर्भर नहीं होना चाहिए

अंतिम रूप

  1. जब JVM finalize() विधि लागू किया जाएगा, तो गारंटी नहीं है।

  2. finalize() को जीसी धागा से केवल एक बार कहा जाता है अगर वस्तु को अंतिम रूप से अंतिम रूप देने से विधि को अंतिम रूप से पुनर्जीवित किया जाता है तो इसे फिर से नहीं कहा जाएगा।

  3. आपके आवेदन में, आपके पास कुछ जीवित ऑब्जेक्ट हो सकते हैं, जिस पर कचरा संग्रह कभी भी लागू नहीं होता है।

  4. जीसी थ्रेड द्वारा अंतिम रूप से कोई भी अपवाद फेंक दिया जाता है I

  5. System.runFinalization(true) और Runtime.getRuntime().runFinalization(true) तरीकों से finalize() विधि लागू करने की संभावना बढ़ जाती है लेकिन अब ये दो विधियां नापसंद कर दी गई हैं। धागा सुरक्षा और संभव गतिरोध निर्माण की कमी के कारण ये विधियां बहुत खतरनाक हैं।

shutdownHooks

 public void addShutdownHook(Thread hook) 

एक नया आभासी-मशीन शट डाउन हुक रजिस्टर करता है

जावा वर्चुअल मशीन दो प्रकार की घटनाओं के जवाब में बंद हो जाता है:

  1. कार्यक्रम सामान्य रूप से निकलता है, जब पिछला गैर-डेमन थ्रेड निकल जाता है या जब बाहर निकलता (equivalently, System.exit) विधि लागू होती है, या
  2. वर्चुअल मशीन को उपयोगकर्ता के बीच में बाधित होने के जवाब में समाप्त किया जाता है, जैसे टाइपिंग ^ सी, या सिस्टम-वाइड इवेंट, जैसे उपयोगकर्ता लॉगऑफ या सिस्टम शटडाउन।
  3. शट डाउन हुक केवल एक प्रारंभिक लेकिन अनस्टेड थ्रेड है। जब वर्चुअल मशीन अपना शट डाउन अनुक्रम शुरू करती है तो यह कुछ अनिर्दिष्ट क्रम में सभी पंजीकृत शटडाउन हुक शुरू कर देगी और उन्हें समवर्ती रूप से चलाएगा। जब सभी हुक समाप्त हो जाते हैं, तो अंतिम रूप से ऑन-एक्जेट सक्षम होने पर, सभी असिंकित अंतिम उपकरण चलाएंगे।
  4. अंत में, वर्चुअल मशीन बंद हो जाएगी। नोट करें कि डेमन थ्रेड्स शटडाउन अनुक्रम के दौरान चलने के लिए जारी रहेगा, क्योंकि गैर-डेमन थ्रेड्स के रूप में अगर शट डाउन की शुरुआत की गई है, तो निकास विधि को लागू कर किया जाएगा।
  5. शट डाउन हुकों को अपने काम को जल्दी से समाप्त करना चाहिए जब कोई कार्यक्रम बाहर निकलता है तो उम्मीद है कि वर्चुअल मशीन तुरंत बंद हो जाएगी और बाहर निकल जाएगी।

    लेकिन यहां तक ​​कि ओरेकल दस्तावेज़ भी उद्धृत किए गए हैं

दुर्लभ परिस्थितियों में वर्चुअल मशीन निरस्त हो सकती है, अर्थात्, सफाई से बंद किए बिना चलना बंद करें

ऐसा तब होता है जब वर्चुअल मशीन बाह्य रूप से समाप्त हो जाती है, उदाहरण के लिए, यूनिक्स पर SIGKILL सिग्नल या माइक्रोसॉफ्ट विंडोज पर TerminateProcess कॉल के साथ। वर्चुअल मशीन भी रद्द कर सकता है अगर एक मूल पद्धति बिगड़ा जाती है, उदाहरण के लिए, आंतरिक डेटा संरचनाओं को भ्रष्ट करना या बिना किसी मेमोरी मेमोरी का उपयोग करने का प्रयास करना। यदि वर्चुअल मशीन बंद हो जाती है तो कोई भी शटडाउन हुक चलाए जाने के बारे में कोई गारंटी नहीं की जा सकती है।

निष्कर्ष : try{} catch{} finally{} ब्लॉक्स को उचित रूप से प्रयास करें और finally(} ब्लॉक finally(} में महत्वपूर्ण संसाधनों को रिलीज़ करें। finally{} में संसाधनों को रिलीज़ करने के दौरान, ब्लॉक Exception और Throwable

अंतिम रूप () फ़ंक्शन नाशक है

हालांकि, इसका सामान्य रूप से उपयोग नहीं किया जाना चाहिए क्योंकि यह जीसी के बाद लागू किया जाता है और आप यह नहीं बता सकते कि कब होगा (यदि कभी)।

इसके अलावा, एक से अधिक जीसी को ऑब्जेक्ट को अंतिम रूप देने वाला डीऑलटेट करना () है।

आपको {} अंत में {} कथन का उपयोग करके अपने कोड के तार्किक स्थानों में साफ करने का प्रयास करना चाहिए!

शायद आप कोशिश का उपयोग कर सकते हैं … आखिरकार उस ऑब्जेक्ट को नियंत्रण प्रवाह में अंतिम रूप देने के लिए अवरोधित करें जिस पर आप ऑब्जेक्ट का उपयोग कर रहे हैं। बेशक यह स्वचालित रूप से नहीं होता है, लेकिन न तो C ++ में विनाश करता है आप अक्सर अंत में ब्लॉक में संसाधनों को बंद देखना देखते हैं।

जावा में किसी डिस्ट्रक्टर के निकटतम समतुल्य है () विधि। पारंपरिक विध्वंसक के लिए बड़ा अंतर यह है कि आपको यह सुनिश्चित नहीं किया जा सकता कि इसे कब कहा जाएगा, क्योंकि कचरा कलेक्टर की जिम्मेदारी है। मैं दृढ़तापूर्वक इसे प्रयोग करने से पहले ध्यान से पढ़ने की सिफारिश करता हूं, क्योंकि आपके ठेठ RAIA पैटर्न फाइल संभालता है और इतने पर अंतिम रूप से () अंतिम रूप से काम नहीं करेगा।

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

आपके पोस्ट से यह ध्वनि नहीं आता है कि आप ऑब्जेक्ट रीवाज़ के उद्देश्य के लिए रीसेट विधि को लागू करने का प्रयास कर रहे हैं (सच?) क्या आपकी वस्तुओं को किसी भी अन्य प्रकार के संसाधनों को पकड़ना है, जिन्हें साफ करना होगा (यानी, जो कि बंद होना चाहिए, किसी भी जमा या उधार की गई वस्तुओं को वापस करना होगा)? अगर आप जिस चीज के बारे में चिंतित हैं वह स्मृति डेअलोक है, तो मैं अपने ऑब्जेक्ट स्ट्रक्चर पर पुनर्विचार करता हूं और यह सत्यापित करने का प्रयास करता हूं कि मेरी ऑब्जेक्ट्स स्वयं समाहित संरचनाएं हैं जो जीसी टाइम पर साफ हो जाएंगे।

यदि आप जावा ऐपलेट लिख रहे हैं, तो आप एप्लेट "को नष्ट ()" विधि को ओवरराइड कर सकते हैं। यह है…

  * Called by the browser or applet viewer to inform * this applet that it is being reclaimed and that it should destroy * any resources that it has allocated. The stop() method * will always be called before destroy(). 

जाहिर नहीं, आप क्या चाहते हैं, लेकिन हो सकता है कि अन्य लोग क्या चाहते हैं।

बस मूल प्रश्न के बारे में सोच रहा हूं … मुझे लगता है कि हम अन्य सभी सीखा जवाबों से, और बलोच के आवश्यक प्रभावी जावा से भी , 7, "अंतिम रूप से बचें" से निष्कर्ष निकाल सकते हैं, एक वैध प्रश्न का हल एक तरीके से करना चाहते हैं जावा भाषा के लिए अनुचित है …:

… ओपी वास्तव में आपके सभी वस्तुओं को रखना है जो "प्लेपेन" में एक रीसेट करने की ज़रूरत है, यह करने के लिए एक बहुत ही स्पष्ट समाधान नहीं होगा, जिसके लिए अन्य सभी गैर-पुनर्वर्तनीय वस्तुओं का केवल कुछ प्रकार के माध्यम से संदर्भ होता है एक्सेसर ऑब्जेक्ट का …

और फिर जब आपको "रीसेट" करने की आवश्यकता होती है तो आप मौजूदा प्लेपोन को डिस्कनेक्ट करते हैं और एक नया खाता बनाते हैं: प्लेप्न में ऑब्जेक्ट्स के सभी वेब को बेतरतीब, कभी वापस नहीं लौटाया जाता है, और जीसी द्वारा एक दिन एकत्र किया जाता है।

यदि इन वस्तुओं में से कोई भी Closeable (या नहीं, लेकिन एक close विधि है) आप Closeable में एक Bag में डाल सकते हैं क्योंकि वे (और संभवतः खोले) बनाए गए हैं, और प्लेटेन काटने से पहले एक्सेसर के अंतिम कार्य सभी बंद करने Closeables माध्यम से जाने के लिए उन्हें बंद … होना चाहिए?

कोड शायद ऐसा कुछ दिखाई देगा:

 accessor.getPlaypen().closeCloseables(); accessor.setPlaypen( new Playpen() ); 

closeCloseables संभवतः एक अवरुद्ध विधि हो सकता है, संभवत: जावाएफएक्स धागा में विशेष रूप से समाप्त होने वाले Playpen लिए किसी भी थ्रेड्स में किसी भी Runnables / Callables से निपटने के लिए संभवतः एक कड़ी (उदा। CountdownLatch Runnables ) ।

लंबोक में एक @ क्लैनप एनोटेशन है जो ज्यादातर सी + + डिस्ट्रक्टर्स जैसा दिखता है:

 @Cleanup ResourceClass resource = new ResourceClass(); 

जब इसे संसाधित करने के समय (संकलन समय पर), लंबोक सम्मिलित करता है, तो try-finally करें- try-finally ब्लॉक करें ताकि resource.close() को लागू किया जा सके, जब निष्पादन चर के दायरे को छोड़ देता है आप संसाधन को जारी करने के लिए स्पष्ट रूप से एक अन्य विधि भी निर्दिष्ट कर सकते हैं, उदाहरण के लिए resource.dispose() :

 @Cleanup("dispose") ResourceClass resource = new ResourceClass(); 

मैं मुख्य रूप से सी ++ से निपटने के लिए प्रयोग किया जाता था और यही कारण है कि मुझे एक नाशक की तलाश में भी शामिल है। मैं अब जावा का उपयोग कर रहा हूं। मैंने जो किया है, और यह हर किसी के लिए सबसे अच्छा मामला नहीं हो सकता है, लेकिन मैंने सभी मूल्यों को 0 या फिर किसी फ़ंक्शन के माध्यम से डिफ़ॉल्ट रूप से रीसेट करके अपने स्वयं के नाशक को लागू किया है।

उदाहरण:

 public myDestructor() { variableA = 0; //INT variableB = 0.0; //DOUBLE & FLOAT variableC = "NO NAME ENTERED"; //TEXT & STRING variableD = false; //BOOL } 

आदर्श रूप से यह सभी परिस्थितियों के लिए काम नहीं करेगा, लेकिन जहां ग्लोबल वैरिएबल हैं, वह तब तक काम करेगा जब तक आपके पास उनमें से एक टन नहीं है।

मुझे पता है कि मैं सबसे अच्छा जावा प्रोग्रामर नहीं हूं, लेकिन ऐसा लगता है कि मेरे लिए काम करना है।