हां, यह ऐसा है जैसे आपने एनम में प्रत्येक मान के लिए सिंगलटन इंस्टेंस बनाया है:
सार्वजनिक सार वर्ग RoundingMode {
सार्वजनिक स्थैतिक अंतिम RoundMMode HALF_UP = नया RoundingMode ();
सार्वजनिक स्थैतिक अंतिम RoundMMode HALF_EVEN = नया RoundingMode ();
निजी राउंडमोड () {
// निजी गुंजाइश इस वर्ग के बाहर किसी भी उपप्रकार को रोकता है
}
}
हालाँकि , enum
निर्माण आपको विभिन्न लाभ देता है:
- प्रत्येक इंस्टेंस का स्ट्रिंग () कोड में दिए गए नाम को प्रिंट करता है।
- (जैसा कि किसी अन्य पोस्ट में उल्लेख किया गया है),
switch-case
नियंत्रण संरचना का उपयोग करते हुए स्थिरांक के एक चर की तुलना स्थिरांक से की जा सकती है ।
- एन्यूमरेशन के सभी मानों को
values
प्रत्येक एनुम प्रकार के लिए 'उत्पन्न' क्षेत्र का उपयोग करके क्वेरी की जा सकती है
- यहाँ बड़ी एक wrt पहचान की तुलना है: enum मान क्लोनिंग के बिना क्रमांकन से बचे।
सीरियलाइजेशन एक बड़ी गोटिया है। अगर मैं एक एनम के बजाय ऊपर दिए गए कोड का उपयोग कर रहा था, तो यहां बताया गया है कि समानता की पहचान कैसे होगी:
RoundingMode मूल = RoundingMode.HALF_UP;
मुखर (RoundingMode.HALF_UP == मूल); // गुजरता
ByteArrayOutputStream baos = new ByteArrayOutputStream ();
ObjectOutputStream oos = new ObjectOutputStream (baos);
oos.writeObject (मूल);
oos.flush ();
ByteArrayInputStream bais = new ByteArrayInputStream (baos.toByteArray ());
ObjectInputStream ois = new ObjectInputStream (bais);
RoundingMode deserialized = (RoundingMode) ois.readObject ();
मुखर (RoundingMode.HALF_UP == deserialized); // विफल रहता है
मुखर (RoundingMode.HALF_EVEN == deserialized); // विफल रहता है
आप एनम के बिना इस समस्या का समाधान कर सकते हैं , जिसमें एक तकनीक शामिल है writeReplace
और readResolve
( http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html देखें ) ...
मुझे लगता है कि बिंदु है - जावा समानता के परीक्षण के लिए आपको एनम मान की पहचान का उपयोग करने की अनुमति देने के लिए अपने रास्ते से बाहर चला जाता है; यह एक प्रोत्साहित अभ्यास है।