2013-05-23 6 views
9

मैं 2008 में प्रकाशित जोशुआ ब्लोच द्वारा लिखे गए प्रभावी जावा को पढ़ रहा हूं, और एक टिप कक्षाओं के साथ enum संरचनाओं को प्रतिस्थापित करने के लिए है। पुस्तक से दिखाया गया उदाहरण यहां दिया गया है।जावा में कक्षाओं के साथ enum constructs को बदल रहा है अभी भी प्रासंगिक है?

public class Suit { 
    private final String name; 
    public Suit(String name) { this.name = name; } 
    public String toString() { return name; } 
    public static final Suit CLUBS = new Suit("clubs"); 
    public static final Suit DIAMONDS = new Suit("diamonds"); 
    public static final Suit HEARTS = new Suit("hearts"); 
    public static final Suit SPADES = new Suit("spades"); 
} 

मेरा प्रश्न के बाद से जावा अब, enum प्रकार का समर्थन करता है यह अभी भी एक अच्छा विचार ऊपर दृष्टिकोण का उपयोग करने के लिए है है? जावा एनम प्रकार का उदाहरण यहां दिया गया है।

public enum Day { 
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
} 
+0

जावा में enums कक्षाएं हैं। – FDinoff

+0

मूल enum-like कार्यक्षमता के लिए सरल 'enum' का उपयोग न करने का कोई कारण नहीं है। कुछ उन्नत छोटे बदलाव हैं जो आप enums के साथ नहीं कर सकते हैं जहां टाइप-सुरक्षित एनम पैटर्न अभी भी लागू किया जा सकता है। –

+0

पुस्तक के दूसरे संस्करण को पढ़ें, यह वास्तव में इसके लायक है, क्योंकि इसमें नई जावा विशेषताएं शामिल हैं। –

उत्तर

10

"प्रभावी जावा" पुस्तक अच्छी तरह से enum रों की शुरूआत से पहले भाषा में लिखा गया है, तो मैं बजाय enum सुविधा का उपयोग कर की सिफारिश करेंगे। सौभाग्य से, जावा enum बहुत बहुमुखी कर रहे हैं, ताकि आप जोशुआ की सलाह का पालन बहुत बारीकी से enum सुविधा का उपयोग कर सकते हैं:

public enum Day { 
    SUNDAY("Sunday", 0) 
, MONDAY("Monday", 1) 
, TUESDAY("Tuesday", 2) 
, WEDNESDAY("Wednesday", 3) 
, THURSDAY("Thursday", 4) 
, FRIDAY("Friday", 5) 
, SATURDAY("Saturday", 6); 

    private String name; 
    private int ordinal; 
    public String getName() { return name; } 
    public int getOrdinal() { return ordinal; } 
    public Day(String name, int ordinal) { 
     this.name = name; 
     this.ordinal = ordinal; 
    } 
} 
+0

EnumSets भी एक बहुत उपयोगी निर्माण हैं। – wmorrison365

+6

यह ध्यान देने योग्य है कि दूसरा संस्करण enums के उपयोग को कवर करता है। – Jonathan

+0

धन्यवाद dasblinkenlight, आपका उदाहरण बहुत उपयोगी है। – beyonddc

2

मुझे लगता है कि विचार बिल्कुल विपरीत है। यदि आपके पास enum-like संरचना है - enum का उपयोग करें।

आपकी कक्षा का उदाहरण आपके द्वारा लिखे गए enum के लिए बिल्कुल उपयुक्त नहीं है। सबसे पहले, इसे संकलित नहीं किया जा सकता क्योंकि इसमें CLUBS नामक कई फ़ील्ड शामिल हैं। दूसरा, enum में ऐसे दिन होते हैं जिनका उल्लेख आपकी कक्षा में नहीं किया जाता है।

+0

ओह! आपने मेरा टाइपो पकड़ा – beyonddc

0

जहां तक ​​मुझे पता है, जावा संकलित enum-s public static final ऑब्जेक्ट्स को संकलित करता है। आप javap (http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javap.html) के साथ enum .class फ़ाइलों को देखकर इसे देख सकते हैं।

+0

यह सही है, लेकिन यह वास्तव में प्रश्न का उत्तर नहीं देता है। –

+0

यह दिखाता है कि दोनों दृष्टिकोण समकक्ष हैं। – mrak

+0

केवल अगर स्रोत कोड कोई फर्क नहीं पड़ता, और मैं कहूंगा कि स्रोत बहुत महत्वपूर्ण है। –

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