2008-09-12 5 views
6

में स्टेनलेस संसाधन प्रबंधन सी ++ में हम एक निर्माता में संसाधन प्राप्त करते हैं और इसे विनाशक में छोड़ देते हैं।जावा

तो जब किसी फ़ंक्शन के बीच में कोई अपवाद बढ़ता है तो वहां संसाधन संसाधन रिसाव या लॉक म्यूटेक्स या जो कुछ भी नहीं होगा।

AFAIK जावा कक्षाओं में विनाशक नहीं हैं। तो जावा में संसाधन प्रबंधन कैसे करता है।

उदाहरण के लिए:

public int foo() {  
    Resource f = new Resource(); 
    DoSomething(f); 
    f.Release(); 
} 

कैसे एक रिलीज संसाधन अगर DoSomething एक अपवाद फेंकता कर सकते हैं? हम पूरे कोड पर कोशिश नहीं कर सकते हैं, क्या हम कर सकते हैं?

उत्तर

4

हाँ आप कोशिश कर सकते हैं और आखिरकार अपने कोड के चारों ओर ब्लॉक कर सकते हैं। सी # में एक आशुलिपि बयान "का उपयोग कर" वहाँ है, लेकिन जावा में आप के साथ फंस रहे हैं:

public int foo() { 
    Resource f = new Resource(); 
    try { 
     DoSomething(f); 
    } 
    finally { 
     f.Release(); 
    } 
} 
0

आप उपयोग कर ब्लॉक जावा बंद बहस में शामिल हो चाहते हैं: एस

+0

जहां पर कि बहस चल रही है: एक और अधिक हाल ही सवाल है कि जावा 7 के लिए प्रासंगिक है इस सवाल को देखने के लिए? – Spoike

+0

इंटरनेट पर सभी: http://www.google.dk/search?q=java+closures – svrist

-1

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

हालांकि अपवादों के पास बहुत क्लीनर को संभालने में त्रुटि करने में उनके उपयोग हैं। आप अपने अपवाद लिख सकते हैं और जो कुछ भी कर रहे हैं उसके लिए उन्हें पकड़ सकते हैं। उपयोगकर्ता को मनमाने ढंग से त्रुटि कोड वापस नहीं आ रहा है!

+1

हाँ! चलो उन्हें बदसूरत भ्रमित स्टैक निशान उन्हें वापस शुरू करना शुरू करते हैं! –

+0

आह -429321313 त्रुटि कोड संवाद के बजाय एक NullPointerException प्राप्त करने के चमत्कार। मुझे डेवलपर बनने पर गर्व है :) –

+1

जावा 7 में "संसाधन प्रबंधन" होगा, एक सुविधा जो सभी 'बंद करने योग्य' संसाधनों को बंद कर देगी जब कोई 'try' block' के विशेष रूप का उपयोग करता है। –

3

मुहावरे के आस-पास निष्पादन का उपयोग करके प्रयास/अंत (और अपवाद और एल्गोरिदम) को कारक बनाना संभव है। हालांकि वाक्यविन्यास अत्यधिक verbose है।

public int foo() { 
    withResource(new WithResource() { public void run(Resource resource) { 
     doSomething(resource); 
    }}); 
} 

... 

public interface WithResource { 
    void run(Resource resource); 
} 

public static void withResource(WithResource handler) { 
    Resource resource = new Resource(); 
    try { 
     handler.run(resource); 
    } finally { 
     resource.release(); 
    } 
} 

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

+0

(नया संसाधन() {सार्वजनिक शून्य (संसाधन संसाधन) .... थोड़ा बेहतर पढ़ता है।:-) –

+2

यह करता है, लेकिन यह एक से अधिक तरीकों से गलत है। ;) –

4

यह प्रश्न 2008 तक है और इसलिए जावा 6 से संबंधित है। तब से जावा 7 जारी किया गया है, जिसमें स्वचालित संसाधन प्रबंधन के लिए एक नई सुविधा है।

java techniques for automatic resource release? "prompt cleanup"?