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
Trả lời
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ồmin
,out
vàinout
.
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
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 –
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
Có, bạn có thể. Hãy để tôi chỉnh sửa câu hỏi. – Cristian
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];
}
};
}
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
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
@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ữ. –
Đó 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