我只是用
String enumString = myEnum.name()
Run Code Online (Sandbox Code Playgroud)
(以MyEnum作为枚举,myEnum作为值)获取String表示然后
MyEnum myEnum = MyEnum.valueOf(enumString)
Run Code Online (Sandbox Code Playgroud)
从String表示重构enum.
使用Ordinals可能会快一些,但如果我以后可以添加Enums,这更有可能破坏旧代码.
//编辑:由于我不喜欢将String作为返回类型,我现在实现了像这里提到的Parcellable:通过意图传递枚举或对象(最佳解决方案)
import 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];
}
};
}
Run Code Online (Sandbox Code Playgroud)
除了原始类型之外
String,非原始类型需要方向指示符.方向指标包括in,out和inout.
请查看官方文档:http://developer.android.com/guide/developing/tools/aidl.html#aidlsyntax
此外,您可以考虑传递枚举的String或序数表示,并在需要时将其转换回来.这取自Effective 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);
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,Operation是一个enum.
要获得枚举的序数,请考虑以下示例:
public enum Badges{
GOLD, SILVER, BRONZE;
}
// somewhere else:
int ordinal = Badges.SILVER.ordinal();// this should be 1
Run Code Online (Sandbox Code Playgroud)
是的,您可以通过 AIDL 传递枚举,但您必须在枚举类型上实现 Parcelable。
1:可打包的实现。
public enum RepeatMode implements Parcelable {
NoRepeat,
RepeatAll,
RepeatTrack,
;
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(toInteger());
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<RepeatMode> CREATOR = new Creator<RepeatMode>() {
@Override
public RepeatMode createFromParcel(Parcel in) {
return RepeatMode.fromInteger(in.readInt());
}
@Override
public RepeatMode[] newArray(int size) {
return new RepeatMode[size];
}
};
public int toInteger() { return this.ordinal(); }
public static RepeatMode fromInteger(int value)
{
return values()[value];
}
}
Run Code Online (Sandbox Code Playgroud)
进口:
RepeatMode.aidl:包com.cyberdyne.media;
可分割的重复模式;
并记住将枚举参数标记为参数中的参数。
当你想一想时,这是很明显的。但我敢打赌 Google 不会在 IBinder 接口中使用大量枚举。但我还是这么做了。(感谢 Android studio 提供“Implement Parcelable”,它并不完全适用于枚举,但使事情相对简单)。
关于 Android 枚举的讨论:
针对 Android 中枚举的最佳实践建议在很多个月前就被撤回了。您正在用大约 200 字节的可执行文件换取可怕的可怕代码。自 Android 1.0 以来,手机已经取得了长足的进步。这是理所当然的。使用枚举。(或者使用 Google 使用的疯狂的 Kotlin 驱动属性系统。祝你好运。)
追溯到原始 Java 语言规范的官方 Java 知识不鼓励使用裸 ordinal()。推理:在遥远的未来,维护者可能会无意中重新排序序数并破坏内容。坦率地说,我认为这是 Java 的自负。我为此挣扎了很长时间,经过深思熟虑,我屈服了。
public enum Badges {
GOLD,SILVER, BRONZE; // Must match @array/badge_states
public int toInteger() { return this.ordinal(); }
public static Badges fromInteger(int value) { return values()[value]);
}
Run Code Online (Sandbox Code Playgroud)
如果不出意外的话,它将将该类标记为可能保留整数的类。注释永远不会有什么坏处,它使编组枚举的接收端更漂亮(而且更安全)。
| 归档时间: |
|
| 查看次数: |
8075 次 |
| 最近记录: |