2011-02-08 13 views
5

के माध्यम से उत्तीर्ण करने वाले एम्स के रूप में enums आदिम प्रकार नहीं हैं, एंड्रॉइड में एक सहायता इंटरफ़ेस के माध्यम से एक enum पारित करने का सबसे प्रभावी तरीका क्या है? क्या एनम को पहले एक ordinal में बदलने का कोई तरीका है?सहायता इंटरफ़ेस

+0

चार्ली कॉलिन्स की टिप्पणी पर एक नज़र डालें। यह पूरी तरह से सच है: जितना संभव हो सके enums से बचें। – Cristian

+0

@ क्रिस्टियन जिसे नमक के अनाज से लिया जाना चाहिए। enums अच्छे डिजाइन हैं। एक कारण है कि एंड्रॉइड भाषा से enums को नहीं हटाता है। –

+0

यह सच दोस्त है। हालांकि, मुझे लगता है कि उन्होंने इसे स्थानांतरित नहीं किया क्योंकि यह इतना आसान नहीं है। बाइटकोड को हटाने से पहले वे अभी भी 'जावैक' का उपयोग करते हैं। वैसे भी ... मैं enums प्यार करता हूँ, और जब वे चीजों को स्पष्ट और सुरुचिपूर्ण बनाते हैं तो उनका उपयोग करें। – Cristian

उत्तर

5

गैर आदिम प्रकार, String के अलावा, एक दिशात्मक सूचक की आवश्यकता है। दिशात्मक संकेतकों में in, out और inout शामिल हैं।

कि के लिए आधिकारिक दस्तावेज पर एक नज़र डालें: http://developer.android.com/guide/developing/tools/aidl.html#aidlsyntax

इसके अलावा, आप स्ट्रिंग या enum की क्रमसूचक प्रतिनिधित्व गुजर पर विचार करने और इसे वापस अनुवाद कर जब जरूरत कर सकते हैं। यह प्रभावी जावा 2 संस्करण से लिया जाता है:

// Implementing a fromString method on an enum type 
private static final Map<String, Operation> stringToEnum = new HashMap<String, Operation>(); 
static { // Initialize map from constant name to enum constant 
    for (Operation op : values()) 
     stringToEnum.put(op.toString(), op); 
} // Returns Operation for string, or null if string is invalid 
public static Operation fromString(String symbol) { 
    return stringToEnum.get(symbol); 
} 

ऊपर मामले में, Operation एक enum है।


एक enum की क्रमसूचक इस उदाहरण पर विचार प्राप्त करने के लिए:

public enum Badges{ 
    GOLD, SILVER, BRONZE; 
} 

// somewhere else: 
int ordinal = Badges.SILVER.ordinal();// this should be 1 
+1

यदि आप इसकी मदद कर सकते हैं, तो आपको पूरी तरह से एम्स से बचने पर विचार करना चाहिए (एक एंड्रॉइड प्रोजेक्ट में)। http://developer.android.com/guide/practices/design/performance.html#avoid_enums –

+0

दुर्भाग्य से मेरे पास enums से परहेज करने का विकल्प नहीं है; यह एक सहयोगी परियोजना है। क्या मैं एक enum मूल्य के ordinal निकाल सकते हैं? – Phillip

+0

हां, आप कर सकते हैं। मुझे सवाल संपादित करने दें। – Cristian

7

मैं बस का उपयोग

String enumString = myEnum.name() 

(enum और myEnum मूल्य के रूप में के रूप में MyEnum के साथ) स्ट्रिंग प्रतिनिधित्व प्राप्त करने के लिए और फिर

MyEnum myEnum = MyEnum.valueOf(enumString) 

स्ट्रिंग प्रतिनिधित्व से enum पुनर्निर्माण करने के लिए।

ऑर्डिनल का उपयोग करना थोड़ा तेज़ हो सकता है लेकिन अगर मैं बाद में एम्स जोड़ सकता हूं, तो पुराने कोड को तोड़ने की संभावना अधिक है।

// संपादित करें: मैं स्ट्रिंग वापसी प्रकार के रूप में करने के लिए पसंद नहीं है के रूप में, मैं अब यहाँ उल्लेख की तरह Parcellable कार्यान्वित: Passing enum or object through an intent (the best solution)

आयात android.os.Parcel; आयात android.os.Parcelable;

enum InitResponse implements Parcelable { 
// Everything is fine. 
SUCCESS, 
// Something else 
FOO; 


@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(final Parcel dest, final int flags) { 
    dest.writeString(name()); 
} 

public static final Creator<InitResponse> CREATOR = new Creator<InitResponse>() { 
    @Override 
    public InitResponse createFromParcel(final Parcel source) { 
     return InitResponse.valueOf(source.readString()); 
    } 

    @Override 
    public InitResponse[] newArray(final int size) { 
     return new InitResponse[size]; 
    } 
}; 

} 
+1

अब मैं इस दृष्टिकोण को http://stackoverflow.com/questions/2836256/passing-enum-or-object-through-an-intent-the-best-solution से पठनीय-कार्यान्वयन के साथ इस दृष्टिकोण को जोड़कर समाप्त हुआ जिसके परिणामस्वरूप संपादित कोड ऊपर। – domenukk