2011-03-09 14 views
30

जावा एंड्रॉइड एप्लिकेशन में static final int एस का सेट बनाम enum रखने के फायदे (या नुकसान) क्या हैं? क्या वहां दक्षता या प्रदर्शन अनुकूलन हैं जो एक या दूसरे के उपयोग के पक्ष में होते हैं?एंड्रॉइड: एनम बनाम स्थिर अंतिम स्याही?

मैं के संदर्भ में यह पूछना कहना आशय requestCodes और इस तरह के - के रूप में एक enum है, जो मैं से

+0

enums, अशक्त हो सकता है ints नहीं कर सकते – Erik

+13

सी [क्यों enums नहीं एंड्रॉयड उपयोग अधिक करता है?] (Http:

आप @IntDef/@StringDef व्याख्या का उपयोग करना चाहिए: //stackoverflow.com/questions/4822877/why-doesnt-android-use-more-enums) और [एंड्रॉइड की प्रदर्शन युक्तियों से हटाए गए "एनम्स से बचें जहां आपको केवल इन्स की आवश्यकता है"? (http://stackoverflow.com/प्रश्न/5143256/क्यों-से-बचने-enums- जहां-आप-केवल-जरूरत-इन-हटा-से-एंड्रॉइड-प्रदर्शन) और [कैसे muc एच मेमोरी एनम्स लेते हैं?] (http://stackoverflow.com/questions/143285/how-much-memory-do-enums-take) –

+2

कोड को सबसे साफ तरीके से लिखें जो आप पहले कर सकते हैं; तो यदि आपको पता चलता है कि आपके पास प्रदर्शन समस्या है, और आप पाते हैं कि यह आईओ नहीं है, तो प्रदर्शन के लिए अपना कोड तोड़ने पर विचार करें – iluxa

उत्तर

27

Enum फायदे सी में करने के लिए इस्तेमाल किया गया था से मूल्यों का विरोध किया है, जो एंड्रॉयड नमूना कोड में ints हो जाते हैं this question:

  • वे भी बहुत कुछ प्रकार-सुरक्षित पूर्णांकों, तार, या बूलियन झंडे के सेट की तुलना में कर रहे हैं।
  • वे अधिक पढ़ने योग्य कोड का नेतृत्व करते हैं।
  • इंट या स्ट्रिंग की तुलना में किसी अमान्य मान को enum सेट करना अधिक कठिन है।
  • वे एक चर या पैरामीटर के लिए अनुमति मानों को खोजना आसान बनाता है।
  • मैंने जो भी पढ़ा है, वह इंगित करता है कि वे सी # और अधिकांश जेवीएम में पूर्णांक के साथ-साथ पूर्णांक भी करते हैं।

मैं जोड़ना होगा:

  • Enums सदस्य और उदाहरण चर हो सकता है, जबकि एक int नहीं कर सकता।

अधिकांश अवशेषों की तरह, वे आमतौर पर performance catches up के बाद स्पष्ट रूप से लाभप्रद होते हैं। विशेष रूप से आपके एप्लिकेशन कोड में (फ्रेमवर्क कोड के विपरीत) मैं उन अनुकरणों को अनुकरण करता हूं जो उन्हें अनुकरण करते हैं।

+0

लिंक पुनः के लिए धन्यवाद: एंड्रॉइड दस्तावेज़, मैंने कुछ समय पहले पढ़ा और हमेशा इसके बारे में सोचा। – Ozzy

12

व्यक्तिगत अनुभवों से एक बहुत ही सरल जवाब यह होगा कि Enums बहुत बेहतर प्रकार की सुरक्षा प्रदान करता है या दूसरे शब्दों में संकलक आपके कोड को बग मुक्त रखने में अधिक सक्रिय भूमिका निभाता है।

दूसरी ओर, क्योंकि वस्तुएं ऑब्जेक्ट की दुनिया के "द्वितीय श्रेणी के नागरिक" हैं, इसलिए आमतौर पर उपयोग किए जाने वाले कुछ सूक्ष्म डिजाइन पैटर्न में उपयोग करना मुश्किल हो सकता है, खासकर जब जेनेरिक शामिल होते हैं।

और अंत में, आप बिटफील्ड में स्थिर अंतिम स्याही का उपयोग कर सकते हैं। आप कर सके एक enum के साथ निम्नलिखित: enums से अधिक ints की

int selectedOptions = Options.OPTION1 | Options.OPTION2 | Options.OPTION3; 
+0

जबकि मैंने पहली प्रतिक्रिया को प्रश्न के उचित उत्तर के रूप में स्वीकार किया, मुझे लगता है कि आपके द्वारा लाया जाने वाला अंतिम बिंदु वास्तव में बहुत अच्छा है। मैंने इसे कभी भी कोशिश नहीं की है, लेकिन यह जानना बहुत अच्छा तथ्य है। धन्यवाद! – Cubic

+6

उस अंतिम भाग पर, एनमसेट का उपयोग करने का अनुशंसित तरीका है। मुझे थोड़ा झंडा पैटर्न कभी पसंद नहीं आया है। – Spektr

+0

टाइप सुरक्षा एक बड़ा सौदा है। [नकली एनम चेकर] (https://types.cs.washington.edu/checker-framework/ जैसे स्थिर विश्लेषण चलाकर, आप मौजूदा कोड के साथ पिछड़ा संगतता बनाए रखते हुए, enums के सभी प्रकार-सुरक्षा लाभ प्राप्त कर सकते हैं। वर्तमान/चेकर-ढांचा-manual.html # fenum-चेकर)। यदि आपको मौजूदा कोड के साथ पिछड़ा संगतता की परवाह नहीं है, तो एक enum का उपयोग आमतौर पर बेहतर होता है। – mernst

3

एक लाभ यह एक क्लास फैक्टरी में है। निम्नलिखित सी # कोड एक्स्टेंसिबल नहीं है:

class Factory 
{ 
    public enum DrawableType {CIRCLE,SQUARE}; 
    public static Drawable GetInstance(DrawableEnum e) 
    { 
     if (e == DrawableType.CIRCLE) 
     { 
      return new Circle(); 
     } 
     else if (e == DrawableType.SQUARE) 
     { 
      return new Square(); 
     } 
     else 
     { 
      throw new IndexOutOfRangeException(); // should never get here 
     } 
    } 

मैंने यह खराब कोड लिखा था। डिजाइन पैटर्न की समीक्षा, चार गिरोह एक int का इस्तेमाल किया। मैंने here को पुनर्प्राप्त करने का प्रयास किया।

7

अच्छा ... a bald guy के अनुसार एनम्स really bad for memory हैं।

public static final int NAVIGATION_MODE_STANDARD = 0; 
public static final int NAVIGATION_MODE_LIST = 1; 
public static final int NAVIGATION_MODE_TABS = 2; 

@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) 
public @interface NavigationMode {} 

और फिर

@NavigationMode 
public abstract int getNavigationMode(); 

public abstract void setNavigationMode(@NavigationMode int mode); 
संबंधित मुद्दे