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

34 浏览
0 Comments

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

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

admin 更改状态以发布 2023年5月23日
0
0 Comments

首先,我强烈建议让您的枚举变为不可变的,以防止让使用者惊讶。如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;
  }
}

0
0 Comments

我建议您使用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);

0