जावा 8 स्ट्रीम इंस्टेंसेस हमेशा पास () होना चाहिए?


12

Quoth जावाडोक :

धाराओं में एक BaseStream.close () विधि है और AutoCloseable को लागू करता है, लेकिन लगभग सभी स्ट्रीम इंस्टेंस को उपयोग के बाद वास्तव में बंद करने की आवश्यकता नहीं है। आम तौर पर, केवल धाराएँ जिनका स्रोत एक IO चैनल है (जैसे कि Files.lines द्वारा वापस लौटाए गए (पथ, चारसेट) को बंद करने की आवश्यकता होगी। अधिकांश धाराएँ संग्रह, सरणियों या निर्माण कार्यों द्वारा समर्थित हैं, जिनके लिए किसी विशेष संसाधन प्रबंधन की आवश्यकता नहीं होती है। (यदि किसी स्ट्रीम को बंद करने की आवश्यकता होती है, तो इसे एक कोशिश के साथ संसाधनों के बयान में संसाधन के रूप में घोषित किया जा सकता है।)

"लगभग सभी" और "आम तौर पर" अस्पष्ट हैं - यदि आप एक पुस्तकालय लिख रहे हैं और आप उस स्ट्रीम के उपयोगकर्ताओं से अपनी स्ट्रीम के स्रोत को समाप्त कर रहे हैं, तो आपको हमेशा अपने आप से सवाल पूछना होगा - "क्या मुझे बंद करना चाहिए" यह?" IO- समर्थित स्ट्रीम को बंद करने की आवश्यकता है क्योंकि टर्मिनल संचालन कॉल नहीं करता है close, इसलिए प्रभावी रूप से मुझे हमेशा या तो याद रखना होगा / दस्तावेज़ जहां मेरी स्ट्रीम आ रही है, या मुझे हमेशा यह करना closeहै।

परमाणु विकल्प जो मुझे लगता है कि स्ट्रीम से विधियों को वापस करने या स्ट्रीम मापदंडों को स्वीकार करने के लिए नहीं होगा, जो कि एक भावना है जिसे जेडीके टीम पर कुछ लोगों द्वारा प्रतिध्वनित किया गया है। मुझे लगता है कि धाराओं की व्यावहारिक उपयोगिता को देखते हुए अत्यधिक सीमित होना चाहिए।

धाराएँ बंद करने के बारे में आपकी सर्वोत्तम प्रथाएँ क्या हैं? मैंने JDK के कुछ लोगों से इसका जवाब मांगा, जो आमतौर पर इसी तरह के सामुदायिक प्रश्नों पर सक्रिय रहते हैं, लेकिन कुछ भी प्रासंगिक नहीं पाया गया।


जावा डेवलपर नहीं, लेकिन मैं इन नियमों का उपयोग करूंगा: - यदि कोई स्ट्रीम एक तर्क के रूप में पारित हो जाती है, तो दस्तावेज़ को कॉल करने वाले को आवश्यक रूप से स्ट्रीम बंद करना होगा; - यदि स्ट्रीम आपको फ़ंक्शंस से लौटाया गया है, तो मान लें कि आपको इसे बंद करने की आवश्यकता है।
बार्ट वैन इनगेन शेनौ

जवाबों:


6

जैसा कि आपने कहा, जावा में आपको यह जानने की जरूरत है कि कौन कौन से संसाधन को मुक्त करने के लिए जिम्मेदार है, इसलिए आप उपयुक्त ट्राइ-कैच-कंस्ट्रक्शंस में डाल सकते हैं, कोशिश-के साथ-साथ संसाधन या किसी तरह उस कार्य को सौंप सकते हैं।

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


तो मूल रूप closeसे एकमात्र सुरक्षित विकल्प है? मुझे लगता है कि सवाल यह है कि कैसे हर बार एक स्ट्रीम का उपयोग करने के लिए आसान हो जाएगा कोड बदसूरत बनाने के लिए नहीं।
रूसलान

1
हाँ, अगर वहाँ हो सकता है ग्रहण गैर स्मृति संसाधन हो, ऐसा करने के लिए केवल सुरक्षित बात है वहाँ हैं । इसके आसपास कोई रास्ता नहीं है, भले ही जावा गैर-जीसीएलडी संसाधनों के लिए बहुत बीमार हो।
डेडुप्लिकेटर

तो अगर यह सिर्फ दो संग्रह (शुद्ध मेमोरी) के बीच की धारा है, तो इसे बंद करना आवश्यक नहीं है?
अमलगोविनस

@ एमालगोविंस सही
ब्रैड कपिट

5

जहाँ तक "सर्वोत्तम प्रथाएं" जाती हैं, मुझे लगता है कि "संसाधन धाराओं" को वापस करने वाले तरीकों के लिए नामकरण सम्मेलन का उपयोग करना एक अच्छा विचार है।

यदि किसी स्ट्रीम को close()एड करना है, तो फ़ैक्टरी विधि को कॉल करें open()या openStream()stream()एसडीके द्वारा स्थापित अधिवेशन के बाद, अल्पकालिक धाराओं का निर्माण करने वाली कॉल विधि । हमेशा क्लाइंट को सचेत करने के लिए विधि पर javadoc डालते हैं कि उन्हें close()यह करना चाहिए ।

public interface StreamingServer<RECORD> {
    /** 
     * Return a memory-efficient record stream from {@code source}.
     * Clients <em>must</em> call {@link Stream#close} to dispose the
     * stream.
     */
    Stream<RECORD> openStream(URI source) throws IOException;
}

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

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

@RequiresClose
Stream<RECORD> openStream(URI source) throws IOException { ... }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.