मेरे पास ऐसा कोई मामला है जहां मैं कुछ सेटिंग्स वर्गों में कुंजियों के रूप में enums का उपयोग करना चाहता हूं। डेटाबेस एक स्ट्रिंग मान संग्रहीत करेगा, जिससे हमें डेटाबेस को उतारने के बिना enum स्थिरांक को बदलने की अनुमति मिलती है (थोड़ा बदसूरत, मुझे पता है)। मैं एनम के कन्स्ट्रक्टर में एक रनटाइम अपवाद फेंकना चाहता था ताकि डेटाबेस को मारने से बचने के लिए स्ट्रिंग तर्क की लंबाई पुलिस और एक बाधा उल्लंघन हो रहा था जब मैं इसे आसानी से पहचान सकता था।
public enum GlobalSettingKey {
EXAMPLE("example");
private String value;
private GlobalSettingKey(String value) {
if (value.length() > 200) {
throw new IllegalArgumentException("you can't do that");
}
this.value = value;
}
@Override
public String toString() {
return value;
}
}
जब मैं इस के लिए एक त्वरित परीक्षण बनाया, मैंने पाया कि अपवाद उत्पन्न मेरा नहीं था, लेकिन बजाय एक ExceptionInInitializerError था।
शायद यह गूंगा है, लेकिन मुझे लगता है कि यह स्थिर प्रारंभिक में अपवाद फेंकने के लिए एक काफी मान्य परिदृश्य है।
स्रोत
2011-09-27 20:42:50
आप ऐसा क्यों करना चाहते हैं? मेरे लिए यह enum अवधारणा के दुरुपयोग की तरह लगता है। Enum मान स्थिरांक माना जाता है, जिसका निर्माण किसी भी चीज़ पर निर्भर नहीं है। यहां तक कि यदि तकनीकी रूप से आप _could_ ऐसा करते हैं (चेक किए गए के बजाय एक अनचेक अपवाद फेंककर), तो मैं सुझाव दूंगा कि आप अपने डिज़ाइन को संशोधित करें। यदि आप इस enum के माध्यम से सिंगलटन को लागू करने की कोशिश कर रहे हैं, तो इसे सामान्य श्रेणी के रूप में हाथ से लागू करना बेहतर है। –
मैं सिंगलटन को कार्यान्वित कर रहा हूं, लेकिन इसे सामान्य श्रेणी के रूप में हाथ से कैसे कार्यान्वित करना बेहतर होगा? मुझे अभी भी एक स्थिर प्रारंभकर्ता द्वारा बुलाए गए कोड से अपवाद फेंकना होगा। आप एक enum कन्स्ट्रक्टर से अनचेक अपवाद फेंक सकते हैं। – tukushan
केवल एक enum मूल्य तक पहुंचने के द्वारा फेंक दिया अपवाद प्राप्त करने के बारे में कुछ * icky * है। जब यह सिंगलटन getInstance() विधि है तो इतना बुरा नहीं है। –