2009-11-16 17 views
50

बनाम मैं इस तरह गणना है:Enum मान() लंबाई निजी क्षेत्र

public enum Configuration { 
    XML(1), 
    XSLT(10), 
    TXT(100), 
    HTML(2), 
    DB(20); 

    private final int id; 
    private Configuration(int id) { 
     this.id = id; 
    } 
    public int getId() { return id; } 
} 

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

public enum Configuration { 
    XML(1), 
    XSLT(10), 
    TXT(100), 
    HTML(2), 
    DB(20); 

    private final int id; 
    private Configuration(int id) { 
     this.id = id; 
    } 
    public int getId() { return id; } 

    public static final int Size = 5; 
} 

सबसे तेज़ और अधिक सुरुचिपूर्ण समाधान क्या है?

उत्तर

87

values().length का उपयोग हर बार जब आप इसे कॉल करते हैं तो सरणी की एक नई प्रति बनायेगा। मैं इस बिंदुहीन प्रतिलिपि से बचने के लिए कभी-कभी अपना खुद का List (या सेट, या मानचित्र, जो भी मुझे चाहिए) बनाते हैं। मैं नहीं हार्ड कोड यह हालांकि ... अगर आप केवल आकार की जरूरत है, मैं तो बस का उपयोग करेंगे होगा:

private static final int size = Configuration.values().length; 

अंत में। मूल्यांकन किए जाने तक, सभी मूल्यों को शुरू किया जाएगा। यह अन्य उत्तरों में उठाए गए डीआरवाई और असंगतता चिंताओं से बचाता है।

बेशक, यह अपने आप में माइक्रो-ऑप्टिमाइज़ेशन का थोड़ा सा है ... लेकिन एक जो के साथ समाप्त होता है, अंत में कोड, आईएमओ। अन्य जगहों से values().length पर कॉल करने से आप जो रुचि रखते हैं उसे व्यक्त नहीं करते हैं, जो है enum का आकार - तथ्य यह है कि आप मूल्यों की एक सरणी के माध्यम से इसे प्राप्त करते हैं, आकस्मिक और विचलित, आईएमओ है। लेकिन फिर, यह सिर्फ एक size क्षेत्र होने के रूप में के रूप में पढ़ा नहीं जा सकता है -

values() का उपयोग कर के लिए एक वैकल्पिक EnumSet.allOf().size() जो छोटे enums के लिए बहुत सस्ता हो जाएगा उपयोग करने के लिए है।

+1

यदि आप जावा नामकरण सम्मेलनों का पालन करना चाहते हैं, तो क्या आपको 'आकार' के बजाय निरंतर 'SIZE' नाम नहीं देना चाहिए? – Jubobs

+0

@ जुबब्स: मैं निश्चित रूप से एक सार्वजनिक स्थिरता के लिए होगा, लेकिन एक निजी व्यक्ति के लिए मुझे किसी भी तरह से कोई फर्क नहीं पड़ता। ध्यान दें कि यह * संकलन-समय * निरंतर नहीं है। –

+0

आपके तर्क को समझाने के लिए धन्यवाद। – Jubobs

9

मैं values().length का उपयोग करने की सलाह दूंगा। यह कहीं अधिक सुरुचिपूर्ण है और स्थिरता का उपयोग कर प्रदर्शन ओवरहेड बनाम लापरवाह होगा। इसके अलावा, आप गणना की वास्तविक लंबाई के साथ लगातार कदम से बाहर होने के जोखिम को खत्म करते हैं।

7

गिनती संग्रह करके आप DRY principle का उल्लंघन कर रहे हैं, इसलिए जब तक आपके पास कोई अच्छा कारण न हो, आपको नहीं करना चाहिए।

+0

आर्गगघ - मैं इसके लिए बेहद गुस्से में था लेकिन भूल गया कि उसे क्या कहा गया था! – Adamski

3

एक और तरीका मूल्यों() विधि के शीर्ष पर निरंतर प्रारंभ करने का उपयोग करना है।

public enum Colors { 
    BLUE, GREEN, FUCHSIA; 
    public static int COUNT = Colors.values().length; 
} 

इस तरह से आप स्वचालित रूप से अपडेट किए गए स्थिर होते हैं और फिर भी "मान()" ओवरहेड से बचते हैं।

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