2011-02-08 3 views
5

열거 형은 기본 유형이 아니기 때문에 Android에서 aidl 인터페이스를 통해 열거 형을 전달하는 가장 효과적인 방법은 무엇입니까? 열거 형을 서수로 변환하는 방법이 있습니까? String 이외aidl 인터페이스를 통해 열거 전달

+0

Charlie Collins의 의견을 확인하십시오. 그게 사실입니다 : 가능한 한 enum을 피하십시오. – Cristian

+0

@ 크리스티안은 소금 한 알과 함께 섭취해야합니다. enums 좋은 디자인입니다. 안드로이드가 언어에서 열거 형을 제거하지 않는 이유가 있습니다. –

+0

그건 사실인데. 그러나 나는 그것이 쉽지 않기 때문에 그들이 그것을 옮기지 않았다고 생각한다. 그들은 바이트 코드를 덱싱하기 전에'javac'을 사용합니다. 어쨌든 ... 나는 enum을 좋아하고 일을 분명하고 우아하게 만들 때 그것을 사용합니다. – Cristian

답변

5

비 기본 형식은 방향성 표시를 필요로한다. 방향 표시기에는 in, outinout이 포함됩니다.

은 공식 문서에서 살펴 보자 : 또한 http://developer.android.com/guide/developing/tools/aidl.html#aidlsyntax

, 당신은 문자열 또는 열거의 서수 표현을 통과 고려하고 필요할 때 다시 번역 할 수 있습니다. 이것은 효과적인 자바 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입니다.

String enumString = myEnum.name() 

(값으로 열거하고 myEnum 등 MyEnum와) String 표현을 얻을 수

public enum Badges{ 
    GOLD, SILVER, BRONZE; 
} 

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

당신이 도울 수 있다면 enum을 완전히 (Android 프로젝트에서) 피하는 것도 고려해야합니다. http://developer.android.com/guide/practices/design/performance.html#avoid_enums –

+0

불행히도 열거 형을 피할 수있는 옵션이 없습니다. 이것은 공동 프로젝트입니다. 열거 형 값의 서수를 추출 할 수 있습니까? – Phillip

+0

예, 가능합니다. 질문을 수정하겠습니다. – Cristian

7

단순히 사용


는 열거의 서수이 예제를 고려 얻으려면 그 다음에

MyEnum myEnum = MyEnum.valueOf(enumString) 

을 사용하여 문자열 표현에서 열거 형을 재구성합니다.

서수를 사용하는 것이 더 빠를 수도 있지만 나중에 열거 형을 추가 할 수있는 경우 오래된 코드가 손상 될 가능성이 큽니다.

// 편집 : 반환 형식으로 문자열을 가지고 싶어하지 않기 때문에, 지금 여기에 언급처럼 Parcellable을 구현 : Passing enum or object through an intent (the best solution)

수입 android.os.Parcel; import 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의 Parcellable-Implementation과 결합하여 편집 된 코드가 생성되었습니다. 위. – domenukk

관련 문제