2013-07-02 8 views
5

मेरे पास एक कक्षा है जो ऑटोक्लोसेबल लागू करती है, और जावा 7 के नए प्रयास-संसाधनों के निर्माण के साथ इसका उपयोग करने का इरादा है। हालांकि, मैं यह गारंटी देने का कोई तरीका नहीं समझ सकता कि मेरी कक्षा का उपयोगकर्ता प्रयास-संसाधनों का उपयोग करता है। यदि ऐसा नहीं होता है, तो मेरी कक्षा स्वयं को बंद नहीं कर पाएगी, और बुरी चीजें घटित होंगी। क्या इसका कोई तरीका है - भाषा निर्माण या अन्यथा - इसे लागू करने के लिए? यहां तक ​​कि यह पता लगाने में भी सक्षम है कि मैं कोशिश-संसाधन संसाधनों में हूं या नहीं, ताकि अगर कोई अच्छा न हो तो मैं अपवाद फेंक सकता हूं (हालांकि संकलन-समय का निर्माण बेहतर होगा)।फोर्स के साथ प्रयास करें जावा 7

धन्यवाद!

+0

उपयोगकर्ता क्या प्रयास कर रहा है संसाधनों के साथ स्वचालित रूप से स्वचालित रूप से अपने वर्ग को बंद करने का प्रबंधन करना चाहता है? 'अंतिम' विधि बनाना जो 'बंद' कहलाता है आपकी समस्या को ठीक करता है? – Jeffrey

+0

दुर्भाग्यवश, 'अंतिमकरण' कहने की गारंटी नहीं है। जीसी इसे कॉल न करने का फैसला कर सकता है। – joshlf

+0

असल में, मुझे लगता है कि 'अंतिम रूप देने' की अविश्वसनीयता शायद कारण है कि संसाधनों के साथ प्रयास शुरू किया गया था। – joshlf

उत्तर

3

दुर्भाग्य से उपयोगकर्ता की मूर्खता से खुद को बचाने का कोई तरीका नहीं है।

आप close पर कॉल करने के लिए finalize विधि लागू कर सकते हैं; इस तरह से आप यह सुनिश्चित कर सकते हैं कि ऑब्जेक्ट कचरा इकट्ठा होने पर कम से कम संसाधन बंद हो जाता है, भले ही आप यह नहीं जान सकें कि (या यदि) ऐसा होता है।

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

+1

ऑब्जेक्ट.फिनलाइज() का उपयोग जावा में अत्यधिक हतोत्साहित है। –

+0

जब तक आप नहीं जानते कि आप क्या कर रहे हैं * और * के पास कोई अन्य विकल्प नहीं है;) – Joni

+2

@ डेविडहोफमान: मुझे लगता है कि आपने कुछ गलत समझा है। यह शायद (और कारण के साथ) जीसी द्वारा लागू किए जाने को अंतिम रूप देने पर भरोसा करने के लिए निराश है, लेकिन असल में * कार्यान्वयन * अंतिम रूप से लागू करना कुछ मामलों में संसाधन रिसाव को रोकने का एकमात्र विकल्प है। – jarnbjo

-1

नहीं है, कोई रास्ता नहीं, एक ही बुरी चीजें यदि आप फ़ाइलों या डेटाबेस कनेक्शन खोलने रखने के लिए और आप उन्हें बंद नहीं करते तो क्या होगा

है ... समझदार संसाधनों का इस्तेमाल किया जा सकता है और दायरे के भीतर discarted एक विधि कॉल के, आप हर बार अपना एपीआई कहलाते/बंद कर सकते हैं, यदि नहीं, तो व्यवहार को अच्छी तरह से दस्तावेज किया गया है।

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

+1

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

+0

धन्यवाद @ jarnbjo। मेरे मन में जो कुछ भी था, वह यह है कि यदि आप उन्हें बंद किए बिना संसाधन खोलते रहते हैं, तो आपके पास रिसाव है। मुझे लगता है कि बाद में रिसाव को जल्द से जल्द देखना बेहतर होगा, इस मामले में कि आप किसी भी तरह से अनजान वस्तुओं के संदर्भ रखें, तो मुझे अंतिम रूप देने के लिए कोई रास्ता नहीं कहा जाएगा। यदि आप जीसी पर भरोसा करते हैं, तो आपके प्रोग्राम को चलाने वाले रैम और जीसी की मात्रा के आधार पर आपके पास गैर-निर्धारक व्यवहार हो सकता है –

1

यदि आप वास्तव में संसाधन प्रबंधन की परवाह करते हैं, तो कॉलबैक मुहावरे का उपयोग करना सबसे सुरक्षित तरीका है।

public interface Callback<T> { 
    void handle(T item); 
} 

public class SuperVitalVault { 
    public void all(Callback<Precious> callback) { 
    try (...) { 
     for (Precious i : ...) { 
     callback.handle(i); 
     } 
    } 
    } 
} 

आप Callback.handle(T) बदलने एक boolean वापस जाने के लिए कर सकते हैं जल्दी बाहर निकलने का समर्थन करना चाहते हैं::

आप संग्रह है, लेकिन एक API अंतिम-उपयोगकर्ता संग्रह में आइटम को संभालने के लिए अनुमति देता है कि संपर्क में न आएं
try (...) { 
     for (Precious i : ...) { 
     if (callback.handle(i)) break; 
     } 
    } 

आप अपने खुद के कॉलबैक इंटरफ़ेस को परिभाषित करने से दूर रहना चाहते हैं, आप का उपयोग अमरूद के Function<T, Boolean> या Predicate<T>, लेकिन ध्यान दें कि यह अर्थ विज्ञान अमरूद द्वारा स्थापित किया गया उल्लंघन करता है, कर सकते हैं:

फ़ंक्शन के उदाहरण आमतौर पर पारदर्शी रूप से पारदर्शी होने की अपेक्षा की जाती हैं - कोई साइड इफेक्ट्स नहीं - और बराबर के साथ संगत होने के लिए, यानी, असमान (बी) का अर्थ है कि function.apply (a) .equals (function.apply (ख))।

पूर्वानुमान के उदाहरण आम तौर पर साइड-इफेक्ट-फ्री और बराबर के साथ संगत होने की उम्मीद है।

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