2011-02-08 33 views
5

enumはプリミティブ型ではないので、Androidのaidlインターフェイスでenumを渡す最も効果的な方法は何ですか? enumをordinal firstに変換する方法はありますか?aidlインターフェイスでのenumの受け渡し

+0

チャーリー・コリンズのコメントをご覧ください。それは完全に真実です。できるだけenumを避けてください。 – Cristian

+0

@クリスチャンは塩の穀物と一緒に取る必要があります。列挙型は良い設計です。アンドロイドが言語から列挙を削除しない理由があります。 –

+0

それは本当の人です。しかし、私は彼らがそれを移動していないと思います。それは簡単ではないからです。彼らは依然としてバイトコードをデクシングする前に 'javac'を使います。とにかく...私はenumを愛し、物事をはっきりとエレガントにするときに使用します。 – Cristian

答えて

5
String以外

非プリミティブ型は、方向インジケータを必要とします。方向指示器は、in,outおよびinoutを含む。

そのための公式ドキュメントを見てみましょう:http://developer.android.com/guide/developing/tools/aidl.html#aidlsyntax

また、あなたは、列挙型の文字列または順序表現を渡すことを検討し、必要なときにそれをバック翻訳することができます。これは、効果的なJavaの第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); 
} 

Operationenumあります。


この例を考えてみ列挙の序数を取得するには:

public enum Badges{ 
    GOLD, SILVER, BRONZE; 
} 

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

あなたがそれを手伝うことができるならば、(Androidプロジェクトの)列挙型を完全に避けることも考慮する必要があります。 http://developer.android.com/guide/practices/design/performance.html#avoid_enums –

+0

残念ながら、私は列挙型を避けることはできません。これは共同プロジェクトです。列挙値の序数を抽出できますか? – Phillip

+0

はい、できます。私は質問を編集させてください。 – Cristian

7

私は単純に文字列表現を取得するために(値として列挙型とmyEnumなどMyEnumで)

String enumString = myEnum.name() 

を使用次に

MyEnum myEnum = MyEnum.valueOf(enumString) 

を使用して、String表現から列挙型を再構成します。

オライナルを使用する方が速いかもしれませんが、後で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-solutionsのParcellable-Implementationと組み合わせると、編集されたコードが作成されました上記。 – domenukk

関連する問題