2008-10-16 20 views
9

क्या एक हैंडलर रजिस्टर करने का कोई तरीका है जिसे उस समय ठीक कहा जाएगा जब किसी निश्चित ऑब्जेक्ट का अंतिम संदर्भ जारी किया जाता है?किसी ऑब्जेक्ट का संदर्भ नहीं दिया गया है जब 0 ऑब्जेक्ट का संदर्भ नहीं दिया गया है

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

सभी सूचना तंत्र मैं से कमजोर/प्रेत संदर्भ क्षेत्र केवल कि अधिसूचना समय में कुछ बिंदु पर हो जाएगा राज्य लेकिन वहाँ करने के लिए जब यह क्या होगा के रूप में कोई गारंटी है के बारे में पता कर रहा हूँ ...

उत्तर

13

संक्षेप में , संख्या।

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

+0

क्या आप विनिर्देशन का संदर्भ दे सकते हैं? – searchengine27

4

मेरी समझ से, और मैंने जावा वस्तुओं के लिए "विनाशक" खोजने के लिए कुछ समय देखा है, तो यह जानने का कोई तरीका नहीं है कि आप अंतिम संदर्भ कब खो देते हैं। जावा ऑब्जेक्ट्स के संदर्भ ट्रैक करता है लेकिन प्रदर्शन कारणों से, कचरा संग्रह के दौरान ही इस जानकारी को अपडेट करता है।

सबसे नज़दीकी चीज अंतिम विधि है जिसे कचरा संग्रह के दौरान बुलाया जाना चाहिए लेकिन इसकी कोई गारंटी नहीं है कि उसे तब भी बुलाया जाएगा।

2

समस्या यह है कि, "आप वस्तु को संदर्भित किए बिना कुछ कैसे लागू करते हैं?"

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

-1

आप सकता है ओवरराइड finalize() अपने वस्तु में जारी है, लेकिन यह समस्याग्रस्त है दूसरों के उल्लेख के कारणों के लिए।

अपने विशिष्ट उदाहरण के लिए, आप File.deleteOnExit() जैसे कुछ का उपयोग करने पर एक नज़र डाल सकते हैं, जो VM बाहर निकलने के बाद फ़ाइल को हटा देगा।

0

यह जावा के साथ नहीं किया जा सकता है - जहां तक ​​मैं बता सकता हूं कि इसे संदर्भ-गणना कचरा कलेक्टर की आवश्यकता है। क्या आपने ऑब्जेक्ट के जीवनकाल के लिए इसे खोलने के बजाय, अपनी ऑब्जेक्ट की भौतिक डेटा फ़ाइल को खोलने और बंद करने पर विचार किया है?

+0

जो आप वर्णन करते हैं वह एक संभावित कार्यवाही है। यह अच्छा होगा अगर ऐसे क्लीनअप को इस तरह से लागू करने का कोई तरीका था जिसे एक बार इसकी आवश्यकता हो जाती है। हालांकि, इस उद्देश्य के ग्राहकों को स्पष्ट रूप से साफ करने के लिए याद रखने की आवश्यकता है। त्रुटि के लिए एक possibel स्रोत। – VoidPointer

2

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

मेरा उत्तर Why would you ever implement finalize()?

3

देखें मुझे लगता है कि WeakReference आप क्या चाहते हैं नहीं करता है। जैसे ही कमजोर पहुंचने योग्य (जैसे सभी मजबूत संदर्भ समाप्त हो जाते हैं) जैसे वीक रेफरेंस को संदर्भक्यू में डाल दिया जाता है।

इस लेख को Ethan Nicholas पर देखें।

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

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