मैं एक जावा क्लास बनाने की कोशिश कर रहा हूं जो एकाधिक Closeable
संसाधनों का प्रबंधन करता है। सी ++ समाधान सरल और संसाधनों की एक बड़ी संख्या के साथ आसानी से स्केलेबल होगा:जावा में बंद करने योग्य वस्तुओं को कैसे लिखें?
class composed_resource
{
resource_a a;
resource_b b;
resource_c c;
composed_resource(int x)
: a(x), b(x), c(x)
{ }
~composed_resource()
{ }
};
मेरे अनुभवहीन जावा समाधान:
public class ComposedResource implements Closeable
{
private final ResourceA a;
private final ResourceB b;
private final ResourceC c;
public ComposedResource(int x) /* throws ... */ {
a = new ResourceA(x);
try {
b = new ResourceB(x);
try {
c = new ResourceC(x);
} catch (Throwable t) {
b.close();
throw t;
}
} catch (Throwable t) {
a.close();
throw t;
}
}
@Override
public void close() throws IOException {
try {
a.close();
} finally {
try {
b.close();
} finally {
c.close();
}
}
}
}
एक थोड़ा सुधार हुआ संस्करण:
public class ComposedResource2 implements Closeable
{
private final ResourceA a;
private final ResourceB b;
private final ResourceC c;
public ComposedResource2(int x) /* throws ... */ {
try {
a = new ResourceA(x);
b = new ResourceB(x);
c = new ResourceC(x);
} catch (Throwable t) {
close();
throw t;
}
}
@Override
public void close() throws IOException {
try {
if (a != null) a.close();
} finally {
try {
if (b != null) b.close();
} finally {
if (c != null) c.close();
}
}
}
}
वहाँ एक है अधिक सुरुचिपूर्ण समाधान जो अभी भी अपवाद सुरक्षा को बनाए रखते हुए घोंसला वाले प्रयास-पकड़-ब्लॉक से बचाता है? यह तीन संसाधनों के साथ प्रबंधनीय है, लेकिन कुछ और भी अनावश्यक हो रहा है। (यदि यह एक स्थानीय गुंजाइश थी, मैं तो बस एक "ट्राई-साथ-संसाधन" बयान इस्तेमाल कर सकते हैं, लेकिन यह है कि यहाँ लागू नहीं है।)
मैं इस बारे में सोचा java.rmi
के साथ काम करते। कन्स्ट्रक्टर में मैं रजिस्ट्री बना रहा/देख रहा हूं, वस्तुओं को देख रहा हूं और ऑब्जेक्ट्स निर्यात कर रहा हूं। क्लोज़() को अनधिकृत और अप्रत्याशित वस्तुओं की आवश्यकता है। मैंने निर्यात/अप्रत्याशित संभालने के लिए रैपर ऑब्जेक्ट्स बनाने के बारे में सोचा (जैसे मैं आरएआईआई का लाभ लेने के लिए सी ++ में करता हूं), लेकिन फिर मैंने देखा कि मुझे बहुत मदद नहीं करेगा (मैं जावा विशेषज्ञ का इतना अधिक नहीं हूं, लेकिन मुझे इसे विश्वविद्यालय के लिए उपयोग करना है)।
फिलहाल मैं ऊपर ComposedResource2
जैसे कुछ का उपयोग कर रहा हूं, और यह ठीक काम करता है। लेकिन अब मुझे यह जानने में दिलचस्पी है कि क्या एक और अधिक सुरुचिपूर्ण समाधान है।
क्या आप एक उपयोग केस पेश कर सकते हैं? हो सकता है कि एक ठोस उदाहरण के साथ काम करना एक अमूर्त समस्या से बेहतर उत्तर देगा ... –
कोशिश-संसाधन नहीं लागू क्यों नहीं है? –
1) रचनाकारों में संसाधन बनाने से बचें - वे, आदर्श रूप से, केवल फ़ील्ड को पैरामीटर असाइन करना चाहिए, और मुझे लगता है कि आरएआईआई यहां लागू नहीं है। 2) यदि संभव हो तो कोशिश-संसाधनों का उपयोग करें (शायद यह आपके लिए अधिक संभव होगा जब आपका कन्स्ट्रक्टर केवल "असाइनमेंट मोड" में काम करेगा)। 3) आप अपना 'बंद करने योग्य' सजावट लिख सकते हैं जो एक ही उदाहरण में एकाधिक 'बंद करने योग्य' उदाहरणों में शामिल होगा। 4) या आप Guava 'com.google.common.io का उपयोग कर सकते हैं।Closer'। –