Android枚举:从整数值以编程方式设置枚举

时间:2016-08-04 03:54:14

标签: java android enums

我想将java枚举序列化/反序列化为int。我正在使用Android Wear可穿戴数据层API在Wear和Phone设备之间传输枚举设置。这意味着我需要将我的枚举转换为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);

这是正确的方法吗?有没有办法验证新索引值是否合法?

2 个答案:

答案 0 :(得分:8)

为了简单起见,我建议您使用emen的方法namevalueof

您的Color将是这样的:

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

答案 1 :(得分:1)

首先,我强烈建议您的枚举不变,以防止用户感到惊讶。 Java 1.5 documentation中所述的枚举的原始用法是替换常量列表。

至于传输数据,Android可穿戴docs on data syncing建议尽可能使用DataMap

  

如果可能,请使用DataMap类。这种方法允许您以Android Bundle的形式处理数据项,因此系统会为您执行对象序列化和反序列化,并且您可以使用键值对操作数据。

虽然我没有使用可穿戴设备的经验,但Android有自己的BundleParcelable序列化机制,而且有Parceler这样的项目可以帮助生成序列化代码您。您可以使用#fromBundle(...)将包转换为数据地图。

如果你使用Parceler路由,你可以依靠内置的枚举序列化或编写任意代码。通过查看available values匹配(或者如果非常大的话,在预先计算的映射中查找它们),从一些规范值创建enum实例是一种常见的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;
  }
}