2009-12-08 10 views
31

मुझे एक ऐसे केस का सामना करना पड़ रहा है जहां मैं एक static final फ़ील्ड को एक प्रारंभिक कथन के साथ घोषित करना चाहता हूं जिसे चेक अपवाद फेंकने के लिए घोषित किया गया है। आमतौर पर, यह इस तरह दिखना चाहते हैं:चेक किए गए अपवाद को फेंकने वाले एक स्थिर अंतिम फ़ील्ड प्रारंभकर्ता को कैसे संभालें

public static final ObjectName OBJECT_NAME = new ObjectName("foo:type=bar");

मुद्दा मैं यहाँ है कि ObjectName निर्माता विभिन्न जांचे हुए अपवादों, जो मैं के बारे में परवाह नहीं है फेंक सकता है (क्योंकि मैं जानता हूँ कि था मेरा नाम मान्य है, और यह ठीक है अगर यह दुर्भाग्य से दुर्घटनाग्रस्त हो जाता है)। ,

 
public static final ObjectName OBJECT_NAME; 
static{ 
    try{ 
     OBJECT_NAME = new ObjectName("foo:type=bar"); 
    }catch(final Exception ex){ 
     throw new RuntimeException("Failed to create ObjectName instance in static block.",ex); 
    } 
} 

क्योंकि स्थिर ब्लॉक वास्तव में कर रहे हैं वास्तव में मुश्किल पढ़ने के लिए: जावा संकलक मुझे सिर्फ इस पर ध्यान न दें (के रूप में यह एक जाँच अपवाद है) करने देगा नहीं, और मैं का सहारा लेना नहीं पसंद करेंगे। क्या किसी के पास इस मामले को एक अच्छे, साफ तरीके से संभालने के बारे में कोई सुझाव है?

+0

मेरा व्यक्तिगत समाधान एक 'CheckedExceptionsAreAPainInTheAssSometimesException' है, जो एक है फेंकने के लिए है क्रम अपवाद। कार्यक्रम तो बस दुर्घटनाग्रस्त हो जाएगा। – Airhead

उत्तर

40

यदि आपको स्थिर ब्लॉक (कुछ लोग नहीं) पसंद नहीं करते हैं तो एक विकल्प एक विधि का उपयोग करना है। आईआईआरसी, जोश ब्लोच ने इसकी सिफारिश की (स्पष्ट रूप से त्वरित निरीक्षण में प्रभावी जावा में नहीं)।

public static final ObjectName OBJECT_NAME = createObjectName("foo:type=bar"); 

private static ObjectName createObjectName(final String name) { 
    try { 
     return new ObjectName(name); 
    } catch (final SomeException exc) { 
     throw new Error(exc); 
    } 
} 

या:

public static final ObjectName OBJECT_NAME = createObjectName(); 

private static ObjectName createObjectName() { 
    try { 
     return new ObjectName("foo:type=bar"); 
    } catch (final SomeException exc) { 
     throw new Error(exc); 
    } 
} 

(संपादित:। विधि से वापस जाने के लिए बजाय static आवंटित दूसरे उदाहरण सही किया)

+2

मैंने इसके बारे में नहीं सोचा था, अब भी मैंने इसे पढ़ा है, मैं 100% निश्चित हूं कि मैंने बहुत समय पहले इस दृष्टिकोण का उपयोग किया है। मैं इसका उपयोग करूंगा क्योंकि मुझे स्थिर ब्लॉक पसंद नहीं हैं और मेरे कोड को शुरुआती लोगों द्वारा पठनीय करने के लिए भी पसंद है (आप कभी नहीं जानते कि कौन आपके बाद कोड बनाए रखेगा :))। – Romain

+0

मुझे "ऑब्जेक्टनाम के प्रकार का परिणाम लौटा देना" की एक संकलक त्रुटि देता है - क्या एक आसान समाधान 'पकड़' ब्लॉक में 'वापसी शून्य' होना चाहिए?लेकिन फिर – mmcrae

+0

डीबग करने के लिए थोड़ा अजीब लगता है कि आप आइटम 59 का जिक्र कर रहे हैं: चेक अपवादों (प्रभावी जावा, द्वितीय संस्करण) के अनावश्यक उपयोग से बचें। उस आइटम में, ब्लोच उस कोड के लेखक को सलाह दे रहा है जो इस बात पर विचार करने के लिए अपवाद फेंकता है कि क्या उसके ग्राहक अपवाद के साथ सामना करने के बाद कुछ उपयोगी कार्रवाई कर सकते हैं। यह इस मामले से अलग है, जहां सवाल अपवाद की वैधता नहीं है, लेकिन अपवाद को संभालने के लिए सबसे अच्छा तरीका है। 'Java.lang.Error' के लिए प्रलेखन को देखने से, मुझे लगता है कि एक त्रुटि फेंकने की भावना यहां करने के लिए सबसे अच्छी बात नहीं है। – nullstellensatz

5

static ब्लॉक पढ़ने के लिए मुश्किल नहीं हैं। तो मैं उस समाधान की सिफारिश करता हूं। हालांकि, आप अपने ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट में लपेट सकते हैं, उदाहरण के लिए ObjectNameWrapper जो आपके ObjectName के साथ interface साझा करता है, और जिसका कन्स्ट्रक्टर आपके ObjectName कन्स्ट्रक्टर को कॉल करता है, जो होने वाले सभी चेक अपवादों को छुपाता है। लेकिन फिर, मैं स्थिर विकल्प के लिए जाना होगा।

+2

किसी अन्य ऑब्जेक्ट को पेश करना प्रतीत होता है। –

+1

मैं निश्चित रूप से आपसे सहमत हूं। आपका स्थैतिक विधि सुझाव बेहतर तरीका है। – Bozho

16

आपका कोड पूरी तरह से मान्य है। मुझे इसे पढ़ने में मुश्किल नहीं है। अन्य तरीकों से यह केवल और भी बदतर हो जाएगा। उन्हें शुरुआत करने वालों के लिए पढ़ना मुश्किल होता है, क्योंकि उनमें से अधिकतर इससे परिचित नहीं हैं। कोड में तत्वों के क्रम के संबंध में बस मानक सम्मेलनों का पालन करें। जैसे स्थिर प्रारंभिककर्ताओं को आधा रास्ते या कोड के पूरे तल पर न रखें और उनमें से कई कक्षा में फैले हुए न हों। स्थैतिक घोषणाओं के बाद, बस शीर्ष पर एक डालें।

+0

यह एक बहुत ही वैध बिंदु है (इसलिए मैंने इसे स्वीकार करने के बावजूद इसे वोट दिया), जीपीपी चींटी भी सबसे अच्छी तरह से कहा गया है। मैं उस विधि का उपयोग नहीं करूंगा क्योंकि जैसा कि आप कहते हैं, शुरुआती लोगों के लिए समझना/पढ़ना मुश्किल है ... और मैं उन लोगों को यह सुनिश्चित नहीं कर सकता हूं जो मेरे बाद इसे बनाए रख सकें :)। – Romain

+0

मुझे यकीन नहीं है कि मैं इसे पसंद करूंगा। इसे 'निजी स्थैतिक' विधि में पुन: सक्रिय करने के साथ आप पर्यवेक्षण खोने का जोखिम उठाते हैं। सामान्य अभ्यास यह है कि कक्षा के पूरे तल पर उन तरह के तरीकों (उपयोगिता विधियों) को रखा जाता है। लेकिन ठीक है, आजकल आपके पास आईडीई है ताकि आप आगे क्लिक कर सकें। – BalusC

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