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

Android enum: set enum programatically from integer value

我想将JavaEnm序列化/反序列化为int。我使用Android Wear可穿戴数据层API来在穿戴和电话设备之间传输EnUM设置。这意味着我需要将枚举转换为int并通过编程返回到枚举。注意,我不需要创建新的枚举,只需要匹配现有的枚举。我担心的是,尽管我可以使用枚举方法轻松地设置一个值,但似乎我可以轻松地设置一个不存在的值。

1
2
3
4
5
6
7
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
}

因此,我可以执行以下操作:

1
2
3
Color color = Color.Red;
int   index = color.id();
putDataMapReq.getDataMap().putInt("color",index);

此值可以作为int进行传输,我希望按如下方式重新构造它,但无法访问setValue()方法:

1
2
3
int newindex = dataMap.getInt ("color");
Color newColor = Color.Undefined;
newColor.setValue(newIndex);

这样做的正确方法是什么?是否有方法验证新索引值是否合法?


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

你的Color将是这样的:

1
2
3
public enum Color {
    Undefined , Red, Yellow, Blue, Green, Black;
}

Serialize:

1
2
Color color = Color.Red;
String name = color.name();

Deserialize:

1
2
String newName = dataMap.getString("color");
Color newColor = Color.valueOf(newName);

更新

如果要使用整数,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
    }
}

Serialize:

1
2
    Color color = Color.Red;
    int index = color.id();

Deserialize:

1
2
    int newIndex = dataMap.getInt("color");
    Color newColor = Color.fromId(newIndex);


首先,我强烈建议将您的枚举设置为不可变的,以防止让用户感到惊讶。Java 1.5文档中所描述的枚举的最初使用是替换常量列表。

至于传输数据,Android可穿戴文档数据同步建议尽可能使用数据地图:

When possible, use the DataMap class. This approach lets you work with data items in the form of an Android Bundle, so the system does object serialization and deserialization for you, and you can manipulate data with key-value pairs.

虽然我对可穿戴设备没有经验,但Android有自己的序列化机制,包括BundleParcelable,还有类似parceler的项目可以帮助您生成序列化代码。您可以使用FromBundle(…)将捆绑包转换为数据映射。

如果您使用parceler路由,则可以依赖内置的枚举序列化或编写任意代码。这是一个常见的Java模式,通过查看一个匹配的可用值(或在一个预先计算的地图中查看它们(如果非常大)),从一些规范值创建EDCOX1×5实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
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;
  }
}