2009-03-26 13 views
5

सी ++ में हमारे पास संसाधन अधिग्रहण प्रारंभ है (RAII) पैटर्न, जो संसाधन प्रबंधन को बहुत सरल बनाता है। विचार किसी भी प्रकार के संसाधनों के लिए कुछ रैपिंग ऑब्जेक्ट प्रदान करना है। रैपिंग ऑब्जेक्ट का विनाशक तब संसाधनों को जारी करने के लिए ज़िम्मेदार होता है, जब यह अपने दायरे से बाहर हो जाता है। उदाहरण के लिए:जावा में संसाधन प्रबंधन की तरह सी ++ संभव है

{ 
    auto_ptr<int> smartPointer = new int; 
    // some other code 

} // the memory allocated for the int is released automatically 
    // by smartPointer's destructor 

सबसे आम उपयोग स्मार्ट पॉइंटर्स हैं। लेकिन, कई अन्य प्रकार के संसाधन हैं (फाइलें, म्यूटेक्स, सॉकेट इत्यादि) जिन्हें ठीक उसी तरह प्रबंधित किया जा सकता है।

जावा में मेमोरी प्रबंधन को परेशान करने की आवश्यकता नहीं है। लेकिन अन्य सभी प्रकार के संसाधन बने रहते हैं। अंत में ब्लॉक है, लेकिन इसका उपयोग काफी असुविधाजनक है, खासकर जब कई अलग-अलग अपवादों को फेंक दिया जा सकता है।

तो, मेरा सवाल यह है कि यदि कोई जावा पैटर्न है जो सी ++ आरएआईआई के बराबर कार्यक्षमता प्रदान करता है? यदि नहीं, तो कृपया इस क्षेत्र में अपनी सर्वोत्तम प्रथाओं को साझा करें (आखिरकार, जब तक कि इसका उपयोग कुछ परिष्कृत तरीके से नहीं किया जाता)।

+0

इस प्रश्न को देखें: http://stackoverflow.com/questions/194261/raii-in-java-is-resource-disposal-always-so-ugly-was-i-had-a-dream – Eclipse

+0

इसके अलावा: http : //stackoverflow.com/questions/477399/does-java-support-raii-deterministic-destruction – Eclipse

+0

"जो संसाधन प्रबंधन को बेहद सरल बनाता है" क्या आप मुझसे मजाक कर रहे हैं ?? – hasen

उत्तर

10

आप सामान्य acquire; try { use; } finally { release; } उपयोग कर सकते हैं देखते हैं। वैकल्पिक रूप से आप संसाधनों को Execute Around idiom के साथ संभाल सकते हैं।

4

यहोशू बलोच एक तंत्र (JDK 7 के लिए छोटे भाषा परिवर्तन) परियोजना सिक्का के हिस्से के रूप जावा के लिए Automatic Resource Management बुलाया जोड़ने का प्रस्ताव किया है:

+0

जो कोशिश/पकड़/अंत में बस (उपयोगी) वाक्य रचनात्मक चीनी है। तो अगर आप आज कुछ करना चाहते हैं (2011 के विपरीत), तो कोशिश/पकड़/अंत में जवाब देखें। –

+2

इसके अलावा आरएआईआई की तुलना में कोशिश/आखिरकार बेकार है। मूल सवाल यह था कि क्या जावा के पास आरएआईआई के समान कुछ भी था, और जवाब जाहिर है, नहीं। –

1
कई कोडर के लिए

, आरए II मुहावरा की ताकत है कि के जीवन अंतर्निहित है संसाधन एक स्कोप ब्लॉक से जुड़ा हुआ है, जो चीजों को बनाने और बनाए रखने के लिए आसान बनाता है; आखिरकार उस संसाधन को रिलीज़ करने में विफल होने से त्रुटियों को कम करना।

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

// explicit release 
MyClass obj = MyClass(); 
obj.UseIt(); 
obj.Dispose(); 

// RAII-like (scope-bound) release 
using(MyClass obj = new MyClass()) 
{ 
    obj.UseIt(); 
} 

शायद हम भविष्य में इस तरह की कार्यक्षमता को लागू करेंगे।

+0

पायथन ने इसे 'साथ' निर्माण – hasen

+0

के साथ जोड़ा है यह सच नहीं है। टॉम हौटिन - टाइकलाइन द्वारा सुझाए गए अनुसार आप निश्चित रूप से इसे जावा में अनुकरण कर सकते हैं। – kirakun

+0

@ किराकुन: "इसे" अनुकरण करें; एक गुंजाइश? मेरा माथे सिर्फ एक इंच बढ़ गया। –

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