2014-06-30 10 views
13

मेरे पास एक सवाल है कि हमें एनम का उपयोग कब करना चाहिए और हमें अंतिम स्थिरांक का उपयोग कब करना चाहिए?एनम/इंट कॉन्स्टेंट्स का उपयोग कब करें

मुझे पता है कि Enums and Constants. Which to use when? पर चर्चा की गई है हालांकि यह सी # प्रश्न है।

मेरा सवाल यह है कि एंड्रॉइड एनम के बजाए इतने सारे कॉन्स्टेंट का उपयोग क्यों करता है? उदाहरण के लिए, Context

मेरी राय में, अगर हम स्थिरांक का उपयोग करें, वहाँ जोखिम है कि नीचे के रूप में हो सकता है: हम एक स्तर लगातार परिभाषित करता है, तो यह है कि

public static final int LEVEL_LOW=1; 
public static final int LEVEL_MEDIUM=2; 
public static final int LEVEL_HIGH=3; 

जब हम पूर्णांक के एक परम पारित = 4। इसमें संकलन त्रुटि नहीं होगी, और यदि हम संख्या 1 को पास करते हैं, तो कोड रीडर आसानी से नहीं जानता कि इसका क्या अर्थ है।

लेकिन एनम इस समस्या को हल कर सकता है हालांकि यह ऑब्जेक्ट के बाद से अधिक ओवरहेड का कारण बन सकता है।

तो क्यों एंड्रॉइड एनम के बजाय स्थिरांक का उपयोग करता है? क्या कोई सिद्धांत है कि हमें इस मामले में स्थिरांक या एनम का उपयोग कब करना चाहिए?

+1

आप Enum इस्तेमाल कर सकते हैं जब आप सुनिश्चित करें कि आप अपने * पूर्व निर्धारित * स्थिरांक की एक सबसेट से गुजर रहे हैं बनाना चाहते देखें। – TheLostMind

+0

मैंने यह भी खुद को आश्चर्यचकित किया। मुझे नहीं लगता कि एंड्रॉइड स्रोत कोड भी enums का उपयोग करता है। – wvdz

+1

अपने कोड में enums का उपयोग करें। एंड्रॉइड में कई मूल्य झंडे हैं जिन्हें जोड़ा जा सकता है (OR'ed)। इसके अलावा एंड्रॉइड कोर "काफी पुराना" है, इसलिए यह हो सकता है कि जब वे जावा का हिस्सा नहीं थे तो उन्होंने विकास शुरू किया। इसके अलावा यह एक एम्बेडेड सिस्टम है, enums अधिक स्मृति की जरूरत है। – brummfondel

उत्तर

14

यह एंड्रॉइड इतिहास से संबंधित है। Froyo से पहले संस्करणों में पुष्टिकरण प्रदर्शन मुद्दों थे। डेवलपर्स द्वारा enum का उपयोग न करने की सिफारिश की गई थी। चूंकि फोरियो प्रदर्शन प्रलेखन के लिए डिजाइनिंग को here वर्णित के रूप में पुनः लिखा गया था।

आपने ध्यान दिया होगा रूप में, हम Froyo के लिए प्रदर्शन प्रलेखन के लिए डिजाइनिंग दुबारा लिखा। पहले यह सामानों का एक गुच्छा था जो किसी बिंदु पर सच साबित हुआ था, लेकिन वास्तविकता के साथ किसी भी संबंध को सहन करना पड़ा। फ्रायओ में, दस्तावेज़ में प्रत्येक एकल दावा को साबित करने के लिए एक बेंचमार्क द्वारा समर्थित किया गया है (या, भविष्य में, इसे अस्वीकार कर दें)। आप अपने ब्राउज़र में "प्रदर्शन के लिए डिजाइनिंग" बेंचमार्क को देख सकते हैं।

लेकिन विरासत सामग्री की संरचना को बदलने में कोई बात नहीं थी।

प्रदर्शन स्ट्रिंग को संग्रहीत करने के लिए आवश्यक होने से संबंधित हो सकता है। प्रत्येक स्थिरांक बनाम एकाधिक enums के लिए एक वर्ग के निर्माण के बीच महत्वपूर्ण अंतर है।

जावा 7 में उदाहरण के लिए

आप दो क्षेत्रों के साथ एक enum है जब आप चुनाव निरंतर में और दो स्थिर अंतिम पूर्णांकों के साथ एक वर्ग के लिए 44 आइटम की जरूरत है आप की जरूरत केवल 17.

क्या फर्क

class ContantField { 
    public static final int f1 = 0; 
    public static final int f2 = 1; 
} 

enum ContantEnum { 
    E1,E2 
} 
है

यह दो घोषणाएं संग्रहीत और उपयोग किए जाने के तरीके में बहुत अलग हैं। ContantEnum के सरलीकरण की तरह

class ContantEnum { 
    public static final Enum enum0 = new Enum("V1",0); 
    public static final Enum enum1 = new Enum("V2",1); 
    public static final Enum[] values = new Enum[] {enum0,enum1}; 
} 

दिखाई दे सकता है इस सरलीकरण करके आप देख सकते हैं कि enumint की तुलना में अधिक स्मृति संसाधनों की आवश्यकता है।

आपके प्रश्न का उत्तर के लिए, यह enums की भूमिका समझा जाना चाहिए। Enum की एक भूमिका संकलन समय प्रकार सुरक्षा को बढ़ाने के लिए है।

का कहना है कि इस उदाहरण देखें:

public void setImportantThing(int priviledge, int rights) 

public void setImportantThing(Privilege p, Right r) 

int के मामले में हम एक पूर्णांक है कि किसी भी मूल्य पारित कर सकते हैं। enum के टेकेस में हमें उचित उपयोग करने के लिए मजबूर होना पड़ता है।

मामले हम यहाँ है संकलन समय सत्यापन और क्रम पर स्मृति के उपयोग के बीच व्यापार बंद है। आपको अपने लिए निर्णय लेना चाहिए जब आपको enum का उपयोग करना चाहिए और जहां static int पर्याप्त सुरक्षित है।

नोट: enum संस्करण 1.5 में जावा के लिए पेश किया गया था, उन्हें उपयोग करने से पहले यह काफी समस्याग्रस्त more था।

एंड्रॉयड स्टूडियो बीटा में, डेवलपर एनोटेशन का उपयोग कर प्रकार सुरक्षा लागू करने के लिए सक्षम हो जाएगा।

0

जब मैं व्यक्तिगत रूप से प्रोग्रामिंग कर रहा हूं, तो मैं उपरोक्त आपकी विधि का उपयोग करता हूं जब मैं एक नाम को एक महत्वपूर्ण पूर्णांक का प्रतिनिधित्व करना चाहता हूं। उदाहरण के लिए, MAX_INT जो int 50 पर मैप कर सकता है। यह उपयोगी है क्योंकि अगर मैं अपने सभी कोड से गुजरने के बिना चाहता हूं और 60 के दशक में 60 के बिना बदलना चाहता हूं तो मैं int को 60 में बदल सकता हूं।

एक enum के साथ, यह (के रूप में this link बताते हैं) एक विशेष डेटा प्रकार है कि एक चर के लिए सक्षम बनाता है पूर्वनिर्धारित स्थिरांक का एक सेट किया जाता है। इसलिए, यदि आप मूल्यों का एक सीमित सेट चुनना चाहते हैं तो यह एक आदर्श विकल्प होगा - जबकि ऊपर चुनी गई आपकी चुनी गई शैली विस्तारणीय होगी और जैसा कि कहा गया है, मूल्य को चुनकर मूल्य का चयन करके आसानी से उपयोग करना आसान है।

1

असल में एंड्रॉइड कोर सी/सी ++ कोड है। यह पूर्णांक के साथ काम करता है। तो जावा में enums का उपयोग करते समय हर मूल्य "अनुवादित" होना था। यह सीपीयू समय और स्मृति खर्च होगा। दोनों एम्बेडेड सिस्टम पर दुर्लभ हैं।

+2

जावा को बाइट कोड में अनुवादित किया जाता है। फिर बाइट कोड का अनुवाद दल्विक बाइट कोड में किया जाता है। डाल्विक बाइट कोड दाल्विक वीएम के माध्यम से निष्पादित किया जाता है। Enum पूर्णांक के रूप में represeted किया जा सकता है। स्ट्रिंग स्ट्रिंग का उपयोग करने वाले एनम पर एक ओवरहेड है। यह और अधिक संभावना है कि यह कारण था। कि enum के साथ आप अपने नाम न केवल पूर्णांक स्टोर करने की जरूरत है। –

+1

लेकिन आपको प्रत्येक enum के साथ पूर्णांक मान को स्टोर करना होगा जिसके लिए स्मृति की आवश्यकता है। जावा सी की तरह एक enum के लिए एक संख्यात्मक मूल्य नहीं देता है। – brummfondel

+0

धन्यवाद! यह वास्तव में उचित है! – Jaskey

1

सीधे शब्दों में कहें Enums अधिक संसाधनों का उपयोग तो जनता स्थिर अंतिम क्षेत्रों तो मोबाइल कार्यक्रमों की जहां हर बाइट मायने रखता है में Enum प्रयोग नहीं करते।

http://developer.android.com/training/articles/perf-tips.html#UseFinal

4

Enums हैं:

  • सुरक्षित - अधिक बदलने के लिए लचीला।

    enums की सूची में कोई परिवर्तन अधिक करता है, तो परिवर्तन गलत था करने के लिए संकलन समय त्रुटियां होने की संभावना है।

  • स्पष्ट - सबसे डेवलपर्स तुरन्त समझ जायेंगे कि आइटम किसी तरह से जुड़े हुए हैं।

    enum { A, B, C } से psfi A = 0; psfi B = 1; psfi C = 2;

तो एक कनेक्शन साथ मदों की एक समूह स्पष्ट रूप से बहुत अधिक है जब तक आप public static final int उपयोग करने के लिए एक औसत दर्जे का लाभ है, स्मृति पदचिह्न या गति में यह हो सकता है, आपको चाहिए हमेशा enum का उपयोग करें।

When is optimisation premature?

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