2012-12-12 5 views
14

जावा 7 के प्रयास-संसाधनों के साथ घोषणा की आवश्यकता क्यों है और सभी, लेकिन मैं अपने सिर को लपेट नहीं सकता कि try कथन में संसाधन की घोषणा को शामिल करने की आवश्यकता क्यों है। मेरे पेट कहते हैं निम्नलिखित संभव हो जाना चाहिए:जावा के प्रयास-संसाधन-संसाधन

CloseableResource thing; 
try (thing = methodThatCreatesAThingAndDoesSomeSideEffect()) { 
    // do some interesting things 
} 
thing.collectSomeStats(); 

ओह, यह एक सिंटैक्स त्रुटि में परिणाम (रहस्यमय ढंग से एक ; उम्मीद)। try कथन कार्यों में टाइप परिभाषा/घोषणा को स्थानांतरित करना, जो निश्चित रूप से संबंधित स्कोप में स्थानांतरित करता है। जब मैं बंद होने से अपने AutoClosable से अधिक चाहता हूं, तो मैं इस बारे में जान सकता हूं कि मुझे में रुचि है क्यों संकलक को इसकी आवश्यकता होती है।

+1

जावा 9 के रूप में यह पर्याप्त है यदि यह एक अभिव्यक्ति है जो अंतिम या प्रभावी रूप से अंतिम चर के संदर्भ को दर्शाती है। – aioobe

+0

जेडीके अपडेट - https://bugs.openjdk.java.net/browse/JDK-7196163 –

उत्तर

7

आपका संस्करण स्पष्ट रूप से परिभाषित नहीं करता है क्या बंद किया जाना चाहिए उदाहरण

CloseableResource thing; 
Parameter a; 

try (a = (thing = methodThatCreatesAThingAndDoesSomeSideEffect()).getParameter()) { 

भी यदि आप लिखना

try (12) { 

या कुछ और क्या करना है के लिए?

भी

CloseableResource thing1 = methodThatCreatesAThingAndDoesSomeSideEffect(); 
CloseableResource thing2 = methodThatCreatesAThingAndDoesSomeSideEffect(); 

try(thing1) { 
} 

क्यों केवल पास thing1?

तो वर्तमान वाक्यविन्यास आपको बंद ब्लॉक खोलने के साथ एक चर को एक साथ बनाने के लिए मजबूर करता है।

ALSO2

CloseableResource thing1 = methodThatCreatesAThingAndDoesSomeSideEffect();

try(thing1) { 
} 

thing1.doSomethingOnClosedResource(); 

thing1 बनी हुई है।

+0

आपका पहला बिंदु एक अच्छा है; घोषणा छोड़कर फंकी अभिव्यक्तियों की दुनिया खुलती है जो वास्तव में बंद होने पर बहुत अस्पष्टता पैदा कर सकती है। दूसरा बस pebkac है, कुछ जावा थोड़ा अधिक imho से बचने की कोशिश करता है। लेकिन मुझे लगता है कि यह सिर्फ व्यक्तिगत वरीयता है :) – akaIDIOT

+0

पहले उदाहरण में, ए निकटतम नहीं है, इसलिए यह वास्तव में एक कोशिश-संसाधन नहीं है, दूसरा उदाहरण, आप केवल 1 चीज खोलेंगे ताकि यह केवल चीज़ 1 को बंद कर दे, डॉन उस –

+0

@Aviram के साथ कोई समस्या नहीं है, तो क्या होगा यदि 'ए'' बंद करने योग्य 'भी है? – Dims

2

पढ़ना जावा विनिर्देश मैं इस निष्कर्ष पर पहुंचा है (हालांकि इसकी नहीं परोक्ष तो इंगित करता है):

वे आप चर घोषित करने और एक अंतर्निहित अंतिम कहते हैं यह करने के लिए सुनिश्चित करें कि आप कुछ करने के लिए चर rebind नहीं कर सकते हैं बनाने के लिए अन्य।

उस स्थिति में संसाधन को बंद करना असंभव होगा क्योंकि यह अब चर के लिए बाध्य नहीं है।

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

CloseableResource thing; 
try (thing = methodThatCreatesAThingAndDoesSomeSideEffect()) { 
    thing = null; 
    // thing can't be closed now 
} 

वे आप अंतिम का उपयोग करता है, तो उसके बाहर मुझे लगता है कि कर सकता है, लेकिन यह एक तरह से बदसूरत है।


वर्कअराउंड: आप finally उपयोग कर सकते हैं आप घोषित संसाधन तक पहुंचना चाहते हों:

try (CloseableResource thing = methodThatCreatesAThingAndDoesSomeSideEffect()) { 
    // do some interesting things 
} finally { 
    thing.collectSomeStats(); 
} 

अंत में thing में ध्यान रखें पहले से ही

+0

वास्तव में * क्यों * -क्वेशन का उत्तर नहीं है, लेकिन फिर भी मान्य है। – akaIDIOT

+0

हां मैं देखा है कि बाद मैं इस सवाल का जवाब प्रस्तुत और जावा लैंग विनिर्देशों पढ़ने अगर वे कुछ भी लेकिन कुछ भी समझाने को देखने के लिए शुरू कर दिया अब तक –

+0

बाद मैं अंतर्निहित अंतिम अब मैं एक सिद्धांत मिला –

1

बंद कर दिया है के बाद से जावा 9 आप कर सकते हैं ब्लॉक के बाहर कोशिश-के-संसाधन के अंदर उपयोग किए गए चर को घोषित करें और प्रारंभ करें। चर के लिए एकमात्र अतिरिक्त आवश्यकता यह है कि यह effectively final होना चाहिए।
तो अब यह करने के लिए संभव है:

CloseableResource thing = methodThatCreatesAThingAndDoesSomeSideEffect(); 
try (thing) { 
    // do some interesting things 
} 
thing.collectSomeStats(); 

आशा है कि यह मदद करता है।