Android枚举:以整数值编程方式设置枚举类型
Android枚举:以整数值编程方式设置枚举类型
我想将一个 Java 枚举类序列化/反序列化成 int 类型。我使用 Android Wear Wearable Data Layer API 在 Wearable 设备和手机设备之间传输枚举类的设置。这意味着我需要将我的枚举类编程转换成 int 类型然后再转换回来。请注意,我不需要创建新的枚举类,只需要匹配现有的枚举类。我的担心是,虽然我可以通过枚举类方法轻松设置值,但似乎我很容易设置一个不存在的值。
public enum Color { Undefined (0), Red(1), Yellow(2), Blue(3), Green(4), Black(5); private int mValue; private Color(int value) { this.mValue = value;} // Constructor public int id(){return mValue;} // Return enum index public void setValue(int i){mValue = i;}; // Set index }
因此,我可以执行以下操作:
Color color = Color.Red; int index = color.id(); putDataMapReq.getDataMap().putInt("color",index);
此值可以作为 int 类型传输,我想要按照以下方式重新构建它,但是我无法使 setValue() 方法可访问:
int newindex = dataMap.getInt ("color"); Color newColor = Color.Undefined; newColor.setValue(newIndex);
这是正确的操作方式吗?有没有验证新索引值是否合法的方法?
首先,我强烈建议让您的枚举变为不可变的,以防止让使用者惊讶。如Java 1.5文档所述,枚举的原始用途是用来替换常量列表。
关于数据传输,Android Wearable上的数据同步文档建议尽可能使用DataMap:
尽可能使用DataMap类。这种方法让您使用Android Bundle形式的数据项,所以系统会对您进行对象序列化和反序列化,并且可以用键值对操作数据。
虽然我没有使用过可穿戴设备,但Android有自己的序列化机制,使用Bundle和Parcelable,也有一些项目,例如Parceler,可以帮助您生成序列化代码。您可以使用fromBundle()将Bundle转换为DataMap。
如果使用Parceler,您可以依赖内置的枚举序列化,也可以编写任意代码。Java模式中频繁创建一个枚举实例的方式是通过查找可用值(如果非常大,则在预先计算的映射表中查找)来从某个规范值创建枚举实例。
public enum Foo { VAL_1("bar"); private final String strval; Foo(final String strval) { this.strval = strval; } public static Foo fromStrval(final String strval) { for (final Foo f : Foo.values()) { if (f.strval.equals(strval)) return f; } return null; } }
我建议您使用emen的方法名称
和valueof
来进行简化。
您的颜色
将会像这样:
public enum Color { Undefined , Red, Yellow, Blue, Green, Black; }
序列化:
Color color = Color.Red; String name = color.name();
反序列化:
String newName = dataMap.getString("color"); Color newColor = Color.valueOf(newName);
更新
如果您想使用整数,您的代码将会像下面这样:
public enum Color { Undefined (0), Red(1), Yellow(2), Blue(3), Green(4), Black(5); private int mValue; Color(int value) { this.mValue = value;} // Constructor public int id(){return mValue;} // Return enum index public static Color fromId(int value) { for(Color color : values()) { if (color.mValue == value) { return color; } } return Undefined; } }
序列化:
Color color = Color.Red; int index = color.id();
反序列化:
int newIndex = dataMap.getInt("color"); Color newColor = Color.fromId(newIndex);