列挙型はプリミティブ型ではないため、Android の aidl インターフェイスを介して列挙型を渡す最も効果的な方法は何ですか? 最初に列挙型を序数に変換する方法はありますか?
3 に答える
私は単に使用します
String enumString = myEnum.name()
(MyEnum を enum として、myEnum を値として) 文字列表現を取得してから、
MyEnum myEnum = MyEnum.valueOf(enumString)
文字列表現から列挙型を再構築します。
序数を使用すると少し高速になる可能性がありますが、後で列挙型を追加すると、古いコードが壊れる可能性が高くなります。
//編集: 戻り値の型として文字列を持ちたくないので、ここで述べたように Parcellable を実装しました:インテントを介して列挙型またはオブジェクトを渡す (最善の解決策)
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];
}
};
}
以外の非プリミティブ型に
String
は、方向インジケータが必要です。方向指示器にはin
、 、out
およびが含まれinout
ます。
そのための公式ドキュメントを見てください:http://developer.android.com/guide/developing/tools/aidl.html#aidlsyntax
また、列挙型の文字列または序数表現を渡すことを検討し、必要に応じて元に戻すこともできます。これは、Effective Java 2nd edition からの抜粋です。
// 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
です。
列挙型の序数を取得するには、次の例を検討してください。
public enum Badges{
GOLD, SILVER, BRONZE;
}
// somewhere else:
int ordinal = Badges.SILVER.ordinal();// this should be 1