जावा एनम महान हैं। तो जेनरिक हैं। निश्चित रूप से हम सभी प्रकार के क्षरण के कारण बाद की सीमाओं को जानते हैं। लेकिन एक बात है जो मुझे समझ नहीं आ रही है, मैं इस तरह से एक एनम क्यों नहीं बना सकता:
public enum MyEnum<T> {
LITERAL1<String>,
LITERAL2<Integer>,
LITERAL3<Object>;
}
<T>
बदले में यह सामान्य प्रकार का पैरामीटर तब विभिन्न स्थानों में उपयोगी हो सकता है। एक विधि के लिए एक सामान्य प्रकार के पैरामीटर की कल्पना करें:
public <T> T getValue(MyEnum<T> param);
या यहां तक कि एनम वर्ग में ही:
public T convert(Object o);
अधिक ठोस उदाहरण # 1
चूँकि उपर्युक्त उदाहरण कुछ के लिए बहुत सारगर्भित लग सकता है, यहाँ एक और वास्तविक जीवन का उदाहरण है कि मैं ऐसा क्यों करना चाहता हूँ। इस उदाहरण में मैं उपयोग करना चाहता हूं
- Enums, क्योंकि तब मैं संपत्ति कुंजी का एक सीमित सेट की गणना कर सकता हूं
- जेनरिक, क्योंकि तब मेरे पास स्टोरेज प्रॉपर्टीज के लिए मेथड-लेवल टाइप-सेफ्टी हो सकती है
public interface MyProperties {
public <T> void put(MyEnum<T> key, T value);
public <T> T get(MyEnum<T> key);
}
अधिक ठोस उदाहरण # 2
मेरे पास डेटा प्रकारों की गणना है:
public interface DataType<T> {}
public enum SQLDataType<T> implements DataType<T> {
TINYINT<Byte>,
SMALLINT<Short>,
INT<Integer>,
BIGINT<Long>,
CLOB<String>,
VARCHAR<String>,
...
}
प्रत्येक एनुम शाब्दिक में स्पष्ट रूप से सामान्य प्रकार के आधार पर अतिरिक्त गुण होंगे <T>
, जबकि एक ही समय में, एक enum (अपरिवर्तनीय, सिंगलटन, enumerable, आदि) होने के नाते।
सवाल:
क्या किसी ने ऐसा नहीं सोचा? क्या यह एक कंपाइलर-संबंधित सीमा है? इस तथ्य को ध्यान में रखते हुए, कि कीवर्ड " एनम " को सिंटैक्टिक शुगर के रूप में लागू किया गया है, जेवीएम को उत्पन्न कोड का प्रतिनिधित्व करता है, मुझे यह सीमा समझ में नहीं आती है।
यह मुझे कौन समझा सकता है? जवाब देने से पहले, इस पर विचार करें:
- मुझे पता है जेनेरिक प्रकार मिट जाते हैं :-)
- मुझे पता है कि क्लास ऑब्जेक्ट्स का उपयोग करके वर्कअराउंड हैं। वे कामगार हैं।
- सामान्य प्रकार के कंपाइलर-जनरेट किए गए प्रकार के परिणाम जहां भी लागू होते हैं (उदाहरण के लिए कॉल करते समय)
- जेनेरिक टाइप <T> एनम पर होगा। इसलिए यह एनम के प्रत्येक शाब्दिक अर्थ से बंधा है। इसलिए कंपाइलर को पता होता है कि कुछ लिखते समय किस प्रकार का आवेदन करना है
String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
T getvalue()
विधि में सामान्य प्रकार के पैरामीटर के लिए भी यही लागू होता है । कॉल करने पर कंपाइलर टाइप कास्टिंग लागू कर सकता हैString string = someClass.getValue(LITERAL1)
enum
जावा 1.5 से पहले हमारे द्वारा उपयोग किए जाने वाले "टाइपफेस एनम" मुहावरे में बदल जाएं। अचानक, आप अपने एनम सदस्यों को मानकीकृत कर सकते हैं। शायद यही मैं अब करने जा रहा हूं।