/ / किन मामलों में अंतिम रूप से () वास्तव में उपयोग किया जाता है? - जावा, Android, कचरा-संग्रह

किस मामले में वास्तव में उपयोग किया जाता है () वास्तव में उपयोग किया जाता है? - जावा, एंड्रॉइड, कचरा-संग्रह

अंतिम रूप से बताते हुए मुझे कई पोस्ट मिले ()उपयोग नहीं किया जाना चाहिए और यह कि यह सामान्य रूप से उपयोग नहीं किया जाना चाहिए क्योंकि कोई भी वस्तु की गारंटी नहीं देता है कि आवेदन के जीवनकाल के दौरान वस्तु एकत्र की जाएगी, (जब तक आपको वास्तव में आवेदन के जीवन भर वस्तु की आवश्यकता न हो, यह एक मेमोरी लीक है मेरी पुस्तक)। लेकिन मुझे कहना है कि मेरे पास एक जावा वर्ग है जो आरएनआई के माध्यम से मूल स्थान में कुछ (मेमोरी आवंटन और आरंभीकरण करता है) को इनिशियलाइज़ करता है। जहां तक ​​मेरा संबंध है, इसके दो तरीके हैं जिन पर मैं इसे लागू कर सकता हूं:
1। मूल आरंभीकरण और विखंडन करने के लिए एक init () और deinit () विधि को कक्षा में लागू करें। इसका एक डाउन साइड है कि मुझे ऑब्जेक्ट जीवन चक्र का ध्यान रखना है और कचरा कलेक्टर (जो बहुत जावा-जैसा नहीं है) को "छोड़" सकता है।
2. कंस्ट्रक्टर और इनिशियलाइज़ेशन को इनिशियलाइज़ फ़ाइनल () विधि में करें। यह मूल रूप से वस्तुओं को किसी भी अन्य जावा वर्ग की तरह स्वचालित रूप से एकत्र किए जाने वाले कचरे को सक्षम बनाता है।

मैं क्या पूछ रहा हूँ - क्या मेरे लिए नंबर 2 के साथ नहीं जाने का एक कारण है?

धन्यवाद,
नेनाद

उत्तर:

जवाब के लिए 2 № 1

मैं क्या पूछ रहा हूँ - क्या मेरे लिए नंबर 2 के साथ नहीं जाने का एक कारण है?

खैर एक कारण यह होगा कि मूल संसाधन जीता "टी जब तक जीसी ने जावा ऑब्जेक्ट को पुनः प्राप्त नहीं किया है, तब तक जारी रखें finalize विधि इसे पुनः प्राप्त करेगी।

क्या यह कारण वास्तव में प्रासंगिक है, मूल संसाधन की प्रकृति पर निर्भर करता है।


वास्तव में, जब आप इसके बारे में सोचते हैं, तो यह वही बहस है जो जावा डिजाइनरों ने समापन धाराओं के बारे में की होगी।

  • वे एक प्रदान नहीं कर सकते थे close() विधि, और इसे पूरी तरह से एक पर छोड़ दिया finalize विधि ... सिवाय इसके कि आउटपुट स्ट्रीम के साथ समस्याओं को जल्द ही दूर नहीं किया जाएगा, और "फ़ाइल डिस्क्रिप्टर" से बाहर चला जाएगा।

  • वे इसे पूरी तरह से छोड़ सकते थे close() विधि ... सिवाय इसके कि अगर आप भूल गए close() एक फ़ाइल (और वहाँ था "टी ए।" finalize विधि) आप फ़ाइल डिस्क्रिप्टर लीक करेंगे ... स्थायी रूप से।

  • इसके बजाय, उन्होंने दोनों को लागू किया close() तथा finalize, और उन्होंने पूर्व को कॉल करने के लिए बाद को लागू किया। इस प्रकार, जब प्रोग्राम ऐसा कहता है, और आपको साफ करने के लिए बंद करने का लाभ मिलता है1 अगर यह कॉल करने के लिए उपेक्षा करता है close().

1 - बेशक, अगर आप स्ट्रीम पर भरोसा करते हैं तो समस्याएं हो सकती हैं finalize सफाई के लिए विधि; जैसे यदि धारा दुर्घटना से पहुंच से बाहर रहती है, या अगर यह कचरा जल्द ही इकट्ठा नहीं होता है, और आप वैसे भी फाइल डिस्क्रिप्टर से बाहर निकलते हैं। और गैर-नियतात्मक फ्लशिंग आउट आउटपुट भी एक समस्या हो सकती है।


ठीक। जब प्रश्न में संसाधन विशुद्ध रूप से स्मृति है तो क्या होगा? Isn "t कि कचरा इकट्ठा करने के रूप में तो वही?

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


जवाब के लिए 0 № 2

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