2011-02-08 44 views
5

Vì enums không phải là kiểu nguyên thủy, cách hiệu quả nhất để vượt qua enum thông qua giao diện aidl trong Android là gì? Có cách nào để chuyển đổi enum thành một thứ tự đầu tiên?Truyền thông qua các giao diện trợ giúp

+0

Hãy xem nhận xét của Charlie Collins. Điều đó hoàn toàn đúng: tránh enums càng nhiều càng tốt. – Cristian

+0

@Cristian cần được thực hiện bằng một hạt muối. enums là thiết kế tốt. có một lý do tại sao Android không loại bỏ enums từ ngôn ngữ. –

+0

Đó là anh chàng thực sự. Tuy nhiên, tôi nghĩ rằng họ đã không di chuyển nó bởi vì nó không phải là dễ dàng. Họ vẫn sử dụng 'javac' trước khi dexing bytecode. Dù sao ... Tôi yêu enums, và sử dụng chúng khi họ làm cho mọi thứ rõ ràng và thanh lịch. – Cristian

Trả lời

5

Các loại nguyên thủy, khác với String, yêu cầu chỉ báo định hướng. Chỉ báo chỉ đường bao gồm in, outinout.

Hãy nhìn vào các tài liệu chính thức cho rằng: http://developer.android.com/guide/developing/tools/aidl.html#aidlsyntax

Ngoài ra, bạn có thể xem xét thông qua các chuỗi hoặc đại diện thứ tự của enum và dịch nó trở lại khi cần thiết. Này được lấy từ phiên bản thứ 2 Java hiệu quả:

// 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); 
} 

Trong trường hợp trên, Operation là một enum.


Để có được thứ tự của một enum xem xét ví dụ sau:

public enum Badges{ 
    GOLD, SILVER, BRONZE; 
} 

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

Bạn cũng nên xem xét tránh hoàn toàn enums (trong một dự án Android), nếu bạn có thể giúp nó. http://developer.android.com/guide/practices/design/performance.html#avoid_enums –

+0

Rất tiếc, tôi không có tùy chọn tránh né enums; đây là một dự án cộng tác. Tôi có thể trích xuất thứ tự của một giá trị enum? – Phillip

+0

Có, bạn có thể. Hãy để tôi chỉnh sửa câu hỏi. – Cristian

7

tôi chỉ đơn giản sử dụng

String enumString = myEnum.name() 

(với MyEnum như enum và MyEnum như giá trị) để có được những đại diện chuỗi và sau đó

MyEnum myEnum = MyEnum.valueOf(enumString) 

để tái tạo lại enum từ biểu diễn String.

Sử dụng các thiết bị đầu cuối có thể nhanh hơn một chút nhưng nếu tôi có thể thêm Enums sau, điều này có nhiều khả năng phá vỡ mã cũ hơn.

// Edit: Theo tôi không muốn có String như kiểu trả về, bây giờ tôi thực hiện Parcellable như đề cập ở đây: Passing enum or object through an intent (the best solution)

nhập khẩu android.os.Parcel; nhập 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

Tôi bây giờ đã kết thúc việc kết hợp cách tiếp cận này với việc thực thi Parcellable từ http://stackoverflow.com/questions/2836256/passing-enum-or-object-through-an-intent-the-best-solution dẫn đến mã đã chỉnh sửa ở trên. – domenukk

Các vấn đề liên quan