2009-11-20 7 views
13

एक जावा डेवलपर .NET में आने के नाते मैं IDISposable इंटरफ़ेस को समझना चाहता हूं। क्या कोई इसे समझाने की कोशिश कर सकता है और यह जावा में क्या होता है उससे अलग है? धन्यवाद।जावा में आईडीस्पोजेबल रूपक?

उत्तर

17

मैंने detailed series of articles on IDisposable लिखा था।

यहां मूलभूत विचार यह है कि कभी-कभी आपको संसाधनों के निर्धारिक निपटान की आवश्यकता होती है। IDISposable उस तंत्र प्रदान करता है।

उदाहरण के लिए, कहें कि आपके पास विंडो में नियंत्रण है। जब यह बनाया जाता है, तो यह आंतरिक रूप से एक विंडोज हैंडल (एचडब्ल्यूएनडी) बनाता है। जब आप विंडो से नियंत्रण हटाते हैं, और इसका अब उपयोग नहीं किया जाता है, तो नियंत्रण कचरा संग्रह के लिए योग्य हो जाता है - लेकिन यह तुरंत एकत्र नहीं होता है। वास्तव में, इस बात की कोई गारंटी नहीं है कि इसे एकत्र करने से पहले कितना समय लगेगा।

जब तक जीसी अनाथ नियंत्रण को चलाता और संसाधित नहीं करता है, तब भी यह संसाधनों का उपयोग करेगा, क्योंकि यह अभी भी एचडब्ल्यूएनडी धारण कर रहा है।

आईडीस्पोजेबल उन ऑब्जेक्ट्स के लिए माध्यम प्रदान करता है जिनमें कोड शामिल होता है जिसे जीसी से पृथक क्लीनअप की आवश्यकता होती है ताकि ऑब्जेक्ट के उपयोगकर्ता द्वारा स्पष्ट रूप से साफ किया जा सके। नियंत्रण के मामले में, हम myControl.Dispose(), पर कॉल कर सकते हैं जो तत्काल, नियंत्रण द्वारा उपयोग किए जाने वाले "मूल" संसाधन (एचडब्ल्यूएनडी) को सिंक्रनाइज़ रूप से साफ़ कर देगा।

+2

त्वरित प्रश्न - आप कैसे बता सकते हैं कि संसाधन अप्रबंधित है या स्पष्ट रूप से निपटान की आवश्यकता है? – gil

+3

देखें कि क्या यह IDisposable लागू करता है। :) यदि आप कर सकते हैं, तो हमेशा अपने आईडीस्पोजेबल का निपटान करें। –

+0

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

-3

कोई समकक्ष नहीं है।

इसका उपयोग तब किया जाता है जब आप अप्रबंधित संसाधनों का उपयोग करते हैं (जावा में सभी संसाधन क्षेत्र प्रबंधित)।

प्रबंधित संसाधनों द्वारा आवंटित .net स्मृति में स्वचालित रूप से जीसी (जावा में) द्वारा एकत्रित किया जाता है।

आपके पास अतिरिक्त अप्रबंधित संसाधनों का उपयोग करने का अवसर है, जहां आप स्मृति आवंटन और इसकी रिलीज के लिए जिम्मेदार होंगे।

जब आप संसाधनों की आवश्यकता नहीं है तो आप इस विधि को कॉल करते हैं।

7

ऐसी स्थितियां हैं जब आपको अपनी कक्षा के स्वामित्व वाले संसाधनों के लिए विश्वसनीय निपटान की आवश्यकता होती है। उदाहरण के लिए, खोला कनेक्शन उचित समय में बंद होना चाहिए, न कि जब जीसी स्मृति एकत्र करने का फैसला करता है। इस के लिए सम्मेलन द्वारा .NET विधि Dispose में उपयोग किया जाता है। यह try ... finally ब्लॉक, जैसे में कहा जा सकता है:

IConnection conn = OpenConnection(); 
try{ 
    ... 
}finally{ 
    conn.Dispose(); 
} 

क्योंकि इस पद्धति इतने व्यापक रूप से प्रयोग किया जाता है, वहाँ इस के लिए एक वाक्यात्मक चीनी है:

using(IConnection conn = OpenConnection()){ 
} // Dispose is called at the end. 

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

class TimeMeasure: IDisposable{ 
    public void Measure(string operation) { ... } // recourds operation time 
    public void Dispose(){ 
     ... // print timings for all operations 
    } 
} 

उपयोग:

using(TimeMeasure m = new TimeMeasure()) 
{ 
    DoFoo(); 
    m.Measure("Foo"); 
    DoBar(); 
    m.Measure("Bar"); 
} // timings for 'Foo' and 'Bar' are printed here 

जावा कम या ज्यादा बराबर इंटरफ़ेस में Closeable है। लेकिन इसकी कॉल सुनिश्चित करने के लिए कोई आसान वाक्यविन्यास नहीं है।

कैसे IDisposable लागू किया जाना चाहिए?इसमें कुछ समय मुश्किल है:

  • यदि आप संसाधनों के मालिक हैं, आप यह सुनिश्चित करने के लिए वे स्पष्ट Dispose कॉल करके या जीसी द्वारा लेकिन दोनों से नहीं मुक्त किया जा सकता की जरूरत है। तो, आपको निपटान के तथ्य को इंगित करने वाले ध्वज की आवश्यकता है। कम कोड डुप्लिकेशन के लिए, निपटान कोड अलग विधि में ले जाया गया है।

उदाहरण:

bool disposed; 
public void Dispose(){ 
    Dispose(true); 
    GC.SuppressFinalize(this); // tell GC not to call Finalizer() for this object 
} 

~MyObject(){ 
    Dispose(false); 
} 

void Dispose(bool manualDisposing){ 
    if(!disposed){ 
     disposed = true; 
     if(manualDisposing) 
      ... // call Dispose on all IDisposable fields 
     ... // dispose all native resources 
    } 
} 
  • यदि आप संसाधनों धारण नहीं कर रहे हैं, TimeMeasure वर्ग, finalizer की कोई जरूरत के मामले में, तुम बस Dispose में आवश्यक तर्क है।
2

मूल रूप से IDisposable एक उच्च स्तरीय, using कीवर्ड के साथ संयुक्त पर आप क्या आप इस तरह एक आम जावा मुहावरा के रूप में देखते के लिए वाक्य समर्थन दे रहा है:

Connection c = null; 
    try { 
     c = getConnection(); 
     .... 
    } finally { 
     if (c != null) { 
      c.close(); 
     } 
    } 

तो जावा कीवर्ड का उपयोग करने के लिए किया था और एक करीब विधि परोक्ष कि ब्लॉक के अंत में बुलाया जा रहा है के साथ

//psudo-Java 
    using(Connection c = getConnection()) { 
     ..... 
    } 

: एक close() विधि के साथ IDisposable इंटरफ़ेस, यह इस प्रकार दिखाई देंगे। कोशिश/अंत में कोई ज़रूरत नहीं है।

कहा जा रहा है कि, आईडीस्पोजिबल के पास काफी जटिल अनुबंध है, और मुख्य रूप से अप्रबंधित स्मृति मुक्त करने से संबंधित है। अप्रबंधित स्मृति (मूल रूप से जेएनआई और स्विंग घटकों के साथ, आपको अवधारणा है) के लिए जावा के साथ कड़ी मेहनत करनी है, लेकिन यह .NET में बहुत आम है, इसलिए अवधारणा के लिए भाषा समर्थन है।

11

जावा 1.7 के साथ नया परिचय प्रयास-संसाधन संसाधन है।

try (BufferedReader br = new BufferedReader(new FileReader(path))) { 
    return br.readLine(); 
} 

यहां उपयोग की जाने वाली वस्तुओं को ऑटोक्लोसेबल इंटरफेस को लागू करना होगा। यह IDISposable जैसा बिल्कुल नहीं है, लेकिन अंत में close() स्वचालित रूप से कॉल किया जाता है। यह समान व्यवहार को लागू करने के लिए अवसर प्रदान करता है।

ऊपर कोड के रूप में

BufferedReader br = new BufferedReader(new FileReader(path)); 
try { 
    return br.readLine(); 
} finally { 
    if (br != null) br.close(); 
} 

java tutorial में इस बारे में और अधिक पढ़ें एक ही है। नमूना कोड वहां से आ रहा है।

+0

यह बिल्कुल स्वीकार्य उत्तर होना चाहिए। न केवल यह बताता है कि डिस्पोजेबल अवधारणा कैसे काम करती है, लेकिन यह दिखाती है कि यह जावा पर कैसे लागू किया जाता है। अन्य सभी उत्तरों केवल सी # तंत्र का संदर्भ लें। – JavierIEH

+0

ऑटोक्लोसेबल ऑटोक्लोसेबल नहीं है – Sonny

0

आईडीस्पोजेबल इंटरफ़ेस का उपयोग मैन्युअल रूप से अप्रबंधित संसाधनों को मुक्त करने के लिए किया जाता है।

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