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

Hep*_*tus 4 java enums android

我想将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
}
Run Code Online (Sandbox Code Playgroud)

因此,我可以做到以下几点:

Color color = Color.Red;
int   index = color.id();
putDataMapReq.getDataMap().putInt("color",index);          
Run Code Online (Sandbox Code Playgroud)

这个值可以作为int传输,我想重新构建如下,但我不能让setValue()方法可访问:

int newindex = dataMap.getInt ("color");
Color newColor = Color.Undefined;
newColor.setValue(newIndex);
Run Code Online (Sandbox Code Playgroud)

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

nsh*_*ura 9

我建议您使用emen的方法namevalueof简化.

Color会是这样的:

public enum Color {
    Undefined , Red, Yellow, Blue, Green, Black;
}
Run Code Online (Sandbox Code Playgroud)

连载:

Color color = Color.Red;
String name = color.name();
Run Code Online (Sandbox Code Playgroud)

反序列化:

String newName = dataMap.getString("color");
Color newColor = Color.valueOf(newName);
Run Code Online (Sandbox Code Playgroud)

UPDATE

如果你想使用整数,你的代码将如下所示:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

连载:

    Color color = Color.Red;
    int index = color.id();
Run Code Online (Sandbox Code Playgroud)

反序列化:

    int newIndex = dataMap.getInt("color");
    Color newColor = Color.fromId(newIndex);
Run Code Online (Sandbox Code Playgroud)