2010-06-09 15 views
6

मेरा एक सहकर्मी अंत में ब्लॉक में null के संदर्भ में सेट करता है। मुझे लगता है कि यह बकवास है।अंत में ब्लॉक में संदर्भ = शून्य सेट करें?

public Something getSomething() { 
    JDBCConnection jdbc=null; 
    try { 
     jdbc=JDBCManager.getConnection(JDBCTypes.MYSQL); 
     ... 
    } 
    finally { 
     JDBCManager.free(jdbc); 
     jdbc=null; // <-- Useful or not? 
    } 
} 

आप इसके बारे में क्या सोचते हैं?

+0

इस * सटीक * कोड के लिए, कोई बिंदु नहीं है/अंत में - अगर getConnection द्वारा अपवाद फेंक दिया गया है, तो jdbc शून्य है, इसलिए मुफ्त कुछ भी नहीं करेगा। संभवतः असाइनमेंट और प्रयास के अंत के बीच वास्तव में कुछ है। –

+0

ऐसा करने के लिए आपके सहयोगी तर्क क्या हैं? –

+0

मुझे लगता है, वह इसे "साफ" मानता है और स्मृति को बचाएगा। – deamon

उत्तर

11

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

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

2

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

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

5

चूंकि यह एक स्थानीय चर है, यह वैसे भी दायरे से बाहर हो जाएगा। यह बकवास है।

यदि यह एक लंबे समय तक जीवित वस्तु का एक उदाहरण चर (सदस्य चर) था, तो यह उपयोगी हो सकता है क्योंकि अन्यथा कचरा कलेक्टर को ऑब्जेक्ट का निपटान करने से रोक सकता है।

-2

यदि विधि को समाप्त करने के बजाय आखिरकार ब्लॉक के बाद और कोड होगा, तो यह कचरा कलेक्टर इसे साफ़ करने में मदद कर सकता है।

+0

इससे अधिक - यह प्रोग्रामर को फ्रीड होने के बाद jdbc का उपयोग करने से रोक देगा। –

+1

नहीं, यह जीसी को साफ करने में मदद नहीं करेगा। जेवीएम स्पेक स्पष्ट है कि केवल संदर्भ जो आगे की गणना में योगदान करते हैं, पहुंच योग्य हैं, इसलिए यदि आप इसे शून्य करते हैं और एनपीई नहीं प्राप्त करते हैं, तो इसका कोई प्रभाव नहीं पड़ता है। यदि आप इसे शून्य करते हैं और एनपीई प्राप्त करेंगे, तो आपने कोड तोड़ दिया है। यह घोषणा करने के लिए कि क्या यह संकलन समय पर प्रयोग किया जाता है, यह घोषणा करने के लिए घोषणा और उपयोग के आसपास एक अतिरिक्त {} डालना आसान है, या इसका उपयोग अलग तरीके से बेहतर तरीके से करने के लिए बेहतर है। –

+0

जेडीबीसी पहले से ही शून्य है। –

1

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

यह कोडिंग शैली का सवाल है। आखिरकार ब्लॉक के बाद एक दिन आप अधिक कोड जोड़ते हैं तो इसका एक छोटा सा फायदा होता है। फिर यह तुरंत स्पष्ट है कि आप jdbc का उपयोग नहीं कर सकते क्योंकि इसे जेडीबीसी प्रबंधक द्वारा मुक्त किया गया है।

तो हाँ, निपटान संसाधनों के संदर्भों को रद्द करने के लिए यह अच्छा अभ्यास है।

+0

_programmer_ दिखाने के लिए +1 जो दिया गया संदर्भ अमान्य है। –

+0

जो भी उस उत्तर को कम करता है - मुझे आपके कारण जानने में खुशी होगी। वास्तव में! –

1

जैसा कि पहले से ही लिखा गया है, इस मामले में यह बेकार है, क्योंकि अंत में विधि समाप्त होती है।
मैं इसे करूँगा, अंत में कोशिश करने के बाद कोड है, अंत में इसके उपयोग को रोकने के लिए। और वहां (बहुत दुर्लभ) स्थितियां हैं जहां यह मदद कर सकती है।
इस आलेख को देखें: Java Memory Puzzle

0

तो उसे वापस आने से पहले सभी स्थानीय चरों को शून्य में सेट करना चाहिए।

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

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