Android में Enums के साथ काम करना


120

मैं लगभग एक गणना गतिविधि के साथ किया जाता हूं जो मैं अपने ऐप के लिए एंड्रॉइड में काम कर रहा हूं। मैं एक जेंडर एनुम बनाने की कोशिश करता हूं, लेकिन किसी कारण से सिंटेक्स त्रुटि हो रही है , एनुमडेक्लेरेशन को पूरा करने के लिए "एनमबॉडी" डालें।

public static enum Gender
{
    static
    {
        Female = new Gender("Female", 1);
        Gender[] arrayOfGender = new Gender[2];
        arrayOfGender[0] = Male;
        arrayOfGender[1] = Female;
        ENUM$VALUES = arrayOfGender;
    }
}

मैंने इसे स्थिर {} के बिना भी आज़माया है, लेकिन मुझे एक ही वाक्यविन्यास त्रुटि मिलती है।


प्रदर्शन मुद्दों के लिए एनमों की सिफारिश नहीं की जाती है, इसके बजाय आदिम स्थिरांक का उपयोग करें। youtube.com/watch?v=Hzs6OBcvNQE
Myke Dev

UPDATE 2019: एआरएम DALVIK को रनटाइम एनवायरमेंट stackoverflow.com/a/56296746/4213436 के रूप में प्रतिस्थापित करने के बाद से एनम एंड्रॉइड में उपयोग करने के लिए ठीक हैं । इसलिए मुझे लगता है कि इस धागे पर अधिकांश उत्तर अप्रासंगिक हैं।
जेडेनाइस

@ जैडेनिस का मतलब है कि आप 'थ्रेड' को सिर्फ संदर्भित करते हैं
YoussefDir

जवाबों:


343

धरती पर आपको यह वाक्य रचना कहां से मिली? Java Enums बहुत सरल हैं, आप केवल मान निर्दिष्ट करते हैं।

public enum Gender {
   MALE,
   FEMALE
}

यदि आप चाहते हैं कि वे अधिक जटिल हों, तो आप उनके साथ इस तरह से मूल्य जोड़ सकते हैं।

public enum Gender {
    MALE("Male", 0),
    FEMALE("Female", 1);

    private String stringValue;
    private int intValue;
    private Gender(String toString, int value) {
        stringValue = toString;
        intValue = value;
    }

    @Override
    public String toString() {
        return stringValue;
    }
}

फिर एनम का उपयोग करने के लिए, आप कुछ इस तरह से करेंगे:

Gender me = Gender.MALE

12
मैं कोशिश करूंगा कि मैं कहूं कि मैं एक पूर्ण शुरुआत था
JMSDEV

87
क्षमा करें, मेरा मतलब यह नहीं था कि नकारात्मक रूप से। बस अजीब सिंटैक्स मैंने कभी भी Enum
Spidy

4
एनम का उल्लेख करने के लिए इसका सहायक भी अनुक्रमिक है, इसलिए आप इंटम मूल्य प्राप्त करने के लिए एनरम पर .ordinal () का उपयोग कर सकते हैं।
कालल वेड

1
प्रश्न में वाक्य रचना एक तरह से एक अपघटनकर्ता का उपयोग करने से आ सकती है।
दान गेट्ज़

9
मैं इस बात पर बहुत हंसा कि "पृथ्वी पर आपको यह वाक्य रचना कहां मिली"। अपने छात्र को एक शिक्षक की तरह कहना
ज़ार ई अहमर

50

इस विवाद के आसपास कुछ बहस हुई है, लेकिन यहां तक ​​कि सबसे हाल के दस्तावेजों में एंड्रॉइड का सुझाव है कि एंड्रॉइड एप्लिकेशन में एनम का उपयोग करना इतना अच्छा विचार नहीं है। इसका कारण यह है क्योंकि वे एक स्थिर स्थिरांक चर की तुलना में अधिक मेमोरी का उपयोग करते हैं। यहां 2014 के एक पृष्ठ से एक दस्तावेज़ है जो एंड्रॉइड एप्लिकेशन में एनम के उपयोग के खिलाफ सलाह देता है। http://developer.android.com/training/articles/memory.html#Overhead

मैं उद्धृत करता हूं:

स्मृति उपरि से अवगत रहें

आपके द्वारा उपयोग की जा रही भाषा और पुस्तकालयों की लागत और ओवरहेड के बारे में जानकार रहें, और जब आप अपना ऐप डिज़ाइन करें, तो शुरू से लेकर अंत तक इस जानकारी को ध्यान में रखें। अक्सर, सतह पर चीजें जो अहानिकर लगती हैं, वास्तव में बड़ी मात्रा में ओवरहेड हो सकती हैं। उदाहरणों में शामिल:

  • स्थैतिक स्थिरांक के रूप में एनमों को अक्सर दो बार से अधिक मेमोरी की आवश्यकता होती है। आपको एंड्रॉइड पर एनम का उपयोग करने से सख्ती से बचना चाहिए।

  • जावा में प्रत्येक वर्ग (अनाम आंतरिक वर्ग सहित) लगभग 500 बाइट्स कोड का उपयोग करता है।

  • हर वर्ग के उदाहरण में 12-16 बाइट्स है RAM ओवरहेड।

  • एक एकल प्रविष्टि को हाशपैप में डालने पर अतिरिक्त प्रविष्टि ऑब्जेक्ट के आवंटन की आवश्यकता होती है जो 32 बाइट्स लेता है (अनुकूलित कंटेनर कंटेनरों के बारे में पिछला अनुभाग देखें)।

कुछ बाइट्स यहाँ और वहाँ जल्दी से अप-ऐप डिज़ाइन जोड़ते हैं जो क्लास हैं- या ऑब्जेक्ट-हैवी इस ओवरहेड से पीड़ित होंगे। यह एक ढेर विश्लेषण को देखने और अपनी समस्या को महसूस करने की कठिन स्थिति में आपको छोड़ सकता है आपकी रैम का उपयोग करके बहुत सी छोटी वस्तुएं हैं।

कुछ ऐसे स्थान हैं जहाँ वे कहते हैं कि ये युक्तियां पुरानी हैं और अब मूल्यवान नहीं हैं, लेकिन जिस कारण से वे इसे दोहराते रहते हैं, अवश्य ही इसमें कुछ सच्चाई है। एंड्रॉइड एप्लिकेशन लिखना कुछ ऐसा है जिसे आपको एक सहज उपयोगकर्ता अनुभव के लिए जितना संभव हो उतना हल्का रखना चाहिए। और प्रदर्शन के हर छोटे इंच मायने रखता है!


कुछ स्थान हैं - क्या आप कुछ जोड़ सकते हैं यदि आप उन्हें जानते हैं? क्योंकि मुझे कोई नहीं मिल रहा है
Krzysztof Skrzynecki

9
यहाँ किसी ने ध्यान दिया कि आधिकारिक दस्तावेज़ों में प्रदर्शन युक्तियों के स्थान पर इनटम्स का उपयोग करने की जानकारी को हटा दिया गया था । इसके अलावा, मैंने शोध किया है और Reddit पर सारांश
Krzysztof Skrzynecki


दोस्तों, मेरा सवाल यह है कि अगर एनम "बुरा" अभ्यास है, तो Google अभी भी एंड्रॉइड के साथ जावा की इस सुविधा का समर्थन क्यों करता है? :(
जेसु कास्त्रो

5
@ JessúsCastro क्योंकि Google यह सुनिश्चित करना चाहता है कि बहुत सारे मौजूदा जावा व्यापार तर्क वाली कंपनियां (जो एनम का उपयोग कर सकती हैं) सिर्फ अपनी लाइब्रेरी को एंड्रॉइड प्रोजेक्ट में छोड़ सकती हैं और जा सकती हैं।
डेविड ब्राउन

22

जैसा कि क्रिस ने टिप्पणी की है, एन्मोम्स को एंड्रॉइड पर बहुत अधिक मेमोरी की आवश्यकता होती है जो कि हर जगह उपयोग किए जाने के रूप में जोड़ता है। आपको इसके बजाय IntDef या StringDef का प्रयास करना चाहिए , जो एनोटेशन का उपयोग करते हैं ताकि कंपाइलर उत्तीर्ण मानों को मान्य कर सके।

public abstract class ActionBar {
...
@IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
@Retention(RetentionPolicy.SOURCE)
public @interface NavigationMode {}

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

@NavigationMode
public abstract int getNavigationMode();

public abstract void setNavigationMode(@NavigationMode int mode);

इसका उपयोग झंडे के रूप में भी किया जा सकता है, जो द्विआधारी संरचना (या / और संचालन) के लिए अनुमति देता है।

संपादित करें : ऐसा लगता है कि इनम को इनट्यूड में बदलना प्रोगार्ड में डिफ़ॉल्ट अनुकूलन में से एक है


3
मुझे इंट कॉन्स्टेंट को सीधे एनोटेशन क्लास में रखना पसंद है। इस प्रकार यह नियमित एनुम जैसा दिखता है। मैंने इसे यहां बताया: blog.shamanland.com/2016/02/int-string-enum.html
K.


9

इस वीडियो के अनुसार यदि आप ProGuard का उपयोग करते हैं, तो आपको Enums के प्रदर्शन के मुद्दों के बारे में सोचने की ज़रूरत नहीं है !!

कई स्थितियों में रक्षक आपकी ओर से Enums का अनुकूलन कर सकते हैं ताकि वास्तव में इसके बारे में सोचने या कोई काम करने की आवश्यकता न हो।


4

एंड्रॉइड का पसंदीदा तरीका @IntDef के साथ लागू किया गया निरंतर स्थिरांक है:

public static final int GENDER_MALE = 1;
public static final int GENDER_FEMALE = 2;

@Retention(RetentionPolicy.SOURCE)
@IntDef ({GENDER_MALE, GENDER_FEMALE})
public @interface Gender{}

// Example usage...
void exampleFunc(@Gender int gender) {
  switch(gender) {
  case GENDER_MALE:

     break;
  case GENDER_FEMALE:
     // TODO
     break;
  }
}

डॉक्स: https://developer.android.com/studio/write/annotations.html#enum-annotations

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.