2012-06-11 7 views
8

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

हालांकि कक्षा के भीतर शून्य के बराबर के लिए, ऑब्जेक्ट का एकमात्र संदर्भ "यह" है।

class A{ 
    public A(){ 
    //Init 
    } 

    public void method destruct(){ 
    if(someCondition){ 
     this=null; //Is this statement valid? Why/Why not? 
    } 
    } 
} 
+1

यदि यह 'वास्तव में * वस्तु का एकमात्र संदर्भ है, तो आप कर चुके हैं: जैसे ही आप विधि छोड़ते हैं और अंततः हटा दिया जाएगा, यह जीसी के लिए योग्य है। –

+9

अपवॉट्स की संख्या थोड़ा परेशान है। :] –

+0

... जो @ जोचिम नहीं होगा, क्योंकि वहां एक कॉलर होता। – lotsoffreetime

उत्तर

11
this=null; //Is this statement valid? Why/Why not? 

यह वैध जावा क्योंकि this एक lvalue नहीं है नहीं है, यानी ऐसा कुछ नहीं जिसे आप असाइन कर सकते हैं। यह एक संकलन त्रुटि है, जैसे 42 = i; एक संकलन त्रुटि है।

(JLS कहते हैं के बारे में कार्य निम्नलिखित: "एक काम ऑपरेटर के पहले संकार्य का परिणाम एक चर, या एक संकलन समय त्रुटि तब होती है होना चाहिए।" - JLS 15.26.1 JLS पाठ तो सूची पर चला जाता है वेरिएबल्स के रूप में अर्हता प्राप्त करने वाली विभिन्न चीजें, और this उनमें से एक नहीं है।)

इसके अलावा, जैसे डफिमो कहते हैं, यह जावा में पूरी तरह से गलत काम करने वाली चीज है। बस जीसी को अपना काम करने दो।

+0

+1 - लालू का उपयोग कर सही स्पष्टीकरण। बिल्कुल सही जवाब। – duffymo

18

आप "संहार" नहीं है वस्तुओं जावा में: तो निम्नलिखित वर्ग मान्य के लिए कोड है। यह गलत है। ऐसा मत करो

ऑब्जेक्ट जावा में ढेर पर बनाए जाते हैं। वे तब तक रहते हैं जब एक संदर्भ होता है जो उन्हें इंगित करता है। कचरा कलेक्टर गड़बड़ी को साफ करता है।

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

लेकिन आपका प्रस्ताव बिल्कुल सही नहीं है। बंद करो और रुको।

0

जावा कचरा कलेक्टर के लिए अपनी कक्षा लेने के लिए इसे अन्य वर्गों का संदर्भ नहीं दिया जाना चाहिए।

कथन this=null; अवैध है क्योंकि असाइनमेंट के बाईं ओर एक चर होना चाहिए।

1

आपका लक्ष्य गहराई से गुमराह है।

या तो उदाहरण के बाहर कोई भी इसके लिए एक गैर-कमजोर संदर्भ रखता है। फिर यह एकत्र नहीं किया जाएगा कि आप अंदर क्या करते हैं। या कोई भी नहीं करता है, तो अंत में यह एकत्रित किया जाएगा, इससे कोई फर्क नहीं पड़ता कि आप अंदर क्या करते हैं। किसी भी मामले में, this=null कोई फर्क नहीं पड़ता, यहां तक ​​कि यह कानूनी जावा कोड भी था। ऐसा मत करो यदि आप ऑब्जेक्ट आजीवन और मेमोरी थकावट के बारे में चिंतित हैं, तो उस वस्तु को देखें जो आप छुटकारा पाने के लिए चाहते हैं।

0

स्पष्ट रूप से delete जावा में विशेष संदर्भ का कोई तरीका नहीं है। फांसी संदर्भों से बचने के लिए जावा ऐसा करता है। यदि आप delete ऑब्जेक्ट करते हैं तो अन्य ऑब्जेक्ट्स इसका संदर्भ लेते हैं, संभावित रूप से डेटा तक पहुंचने और अमान्य डेटा का संदर्भ प्राप्त करने का प्रयास कर सकते हैं।

आपको किसी भी तरह से delete ऑब्जेक्ट्स की कोशिश नहीं करनी चाहिए, बस ऑब्जेक्ट के सभी संदर्भों को शून्य पर ले जाएं।

3

नोट: आप जो सुझाव देते हैं वह उपयोगी होने की संभावना नहीं है।

आप क्या कर सकते हैं प्रतिनिधिमंडल का उपयोग करें।

class A { 
    private AImpl impl = new AImpl(); 

    public void close() { 
     if (impl != null) 
     impl.close(); 
     impl = null; 
    } 
} 

जैसा कि सभी संदर्भ अप्रत्यक्ष हैं, आप सुनिश्चित कर सकते हैं कि वास्तविक वस्तु का केवल एक संदर्भ है और इसे साफ़ करें।


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

0

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

स्मृति प्रबंधन के लिए एक और दृष्टिकोण पर विचार करें।

1

this = null सेट करना यह कहने की कोशिश करना है कि कोई ऑब्जेक्ट स्वयं संदर्भित नहीं करता है। यह हमेशा निहित रूप से संदर्भित करता है। आपको यह जानने की ज़रूरत है कि अन्य ऑब्जेक्ट्स इस संदर्भ में क्या हो सकती हैं और इसके बजाय उनके संदर्भ साफ़ कर सकते हैं। आमतौर पर, यह स्वचालित रूप से होता है क्योंकि ज्यादातर ऑब्जेक्ट्स स्थानीय चर के माध्यम से बनाए जाते हैं जो ढेर पर होते हैं। जब मैं कहता हूं "बनाए रखा" मेरा मतलब है कि उन्हें संदर्भों की एक श्रृंखला के माध्यम से संदर्भित किया जाता है जो अंततः ढेर पर एक चर के लिए जाता है। जब आप विधि छोड़ते हैं, तो संदर्भ साफ़ किया जाता है। लेकिन अगर आपके पास इस ऑब्जेक्ट का संदर्भ देने वाला स्थिर चर है जो एक ऐसा मामला हो सकता है जहां आपको इसे स्पष्ट रूप से शून्य सेट करना होगा।

0

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

0

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

जावा में संदर्भ के बुनियादी प्रकार यहां पाया जा सकता:

अधिक यहाँ: http://docs.oracle.com/javase/1.3/docs/api/java/lang/ref/package-summary.html

संदर्भ के बारे में यहाँ चर्चा: What is the difference between a soft reference and a weak reference in Java? और Understanding Java's Reference classes: SoftReference, WeakReference, and PhantomReference

0

आप कॉल कर सकते हैं:

System.gc() or RuntimeUtil.gc() from the jlibs 

लेकिन अगर आप ऐसा करते हैं तो आप JVM रनटाइम के साथ गड़बड़ करते हैं। यदि आप शून्य पर रीफर्नस सेट करते हैं, तो ऑब्जेक्ट अभी भी मौजूद है, इसका सिर्फ 'संदर्भ इस ऑब्जेक्ट को संदर्भित नहीं करेगा और अगली बार जीसी का आह्वान किया जाएगा, यह ऑब्जेक्ट को नष्ट कर देगा (जब तक कि अन्य संदर्भ इसका संदर्भ न दें)।

0

कोई उपरोक्त कोड मान्य नहीं है। कक्षा के संदर्भ this केवल तब तक चलते हैं जब तक JVM को निष्पादित किया जा रहा है। this == null सेट करना आपको एक कंपाइलर त्रुटि देगा क्योंकि this को संदर्भ के रूप में जाना जाता है, यह वास्तव में एक मान है और आप को पर कोई मान निर्दिष्ट नहीं कर सकते हैं।

यह भी अनावश्यक है क्योंकि this केवल उस कोड के लिए मान्य है जब तक कि उस कोड में निष्पादन होता है और जीसी किसी ऑब्जेक्ट का दावा नहीं कर सकता जो अभी भी निष्पादित हो रहा है। हालांकि जैसे ही ऑब्जेक्ट के लिए निष्पादन समाप्त होता है, this भी खो जाएगा और ऑब्जेक्ट स्वचालित रूप से जीसी के लिए उपलब्ध हो जाएगा (यानी यदि ऑब्जेक्ट का कोई अन्य संदर्भ मौजूद नहीं है)

0

यह एक संकलन त्रुटि है। आप 'इस' को न्यूल असाइन नहीं कर सकते हैं। कीवर्ड 'यह' बराबर के दाईं ओर उपयोग किया जा सकता है (अपवाद के साथ कि बाएं हाथ नल नहीं है। कारण: शून्य को कुछ भी सौंपा जा सकता है)।

विनाश के लिए, जावा में, आपके पास एक जीसी है जो दृश्यों के पीछे आपके लिए यह काम कर सकती है।

कृपया ध्यान दें उपयोगकर्ता परिभाषित वस्तुओं आप अभी भी कुछ इस तरह कर सकते हैं के लिए है कि -

object reference = null; 

हालांकि 'इस' बराबरी की बाईं ओर स्थित नहीं किया जा सकता।

0

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