如何将整数与枚举类型匹配

52

我从Android的本地代码中以long或int的形式收到返回值,我想将其转换或匹配为枚举项以进行处理。这种转换是可能的吗?如何操作?

2个回答

65

如果你完全掌控值和枚举,并且它们是连续的,那么你可以使用枚举序数值:

enum Heyo
{
  FirstVal, SecondVal
}

...later

int systemVal = [whatever];
Heyo enumVal = Heyo.values()[systemVal];

int againSystemVal = enumVal.ordinal();

9
不建议使用序数来获取枚举类型的“值”。相反,应该使用实例字段。请参阅Josh Bloch的《Effective Java第2版》中的第31条建议。 - Vito Andolini
1
为什么不推荐? - Robin Davies
2
@RobinDavies 如果有人(例如来自您的团队)在中间或开头添加价值,将使用 .ordinal() 会破坏整个代码。 - callmebob
不要说“不推荐使用”,我们只需要注意如果枚举被修改,值将会改变。改变枚举的顺序、添加新的枚举或删除现有的枚举都有可能改变整个序列的值。如果你的逻辑是基于这些值编写的,那么改变它们可能会破坏你的代码。如果你可以接受这一点,那就尽情享受吧。 - Raslanove

64
你可以设置枚举,使其包含长整型或整型。
例如:创建这个文件 ePasswordType.java
public enum ePasswordType {

    TEXT(0),
    NUMBER(1);

    private int _value;

    ePasswordType(int Value) {
        this._value = Value;
    }

    public int getValue() {
            return _value;
    }

    public static ePasswordType fromInt(int i) {
        for (ePasswordType b : ePasswordType .values()) {
            if (b.getValue() == i) { return b; }
        }
        return null;
    }
}

你可以像这样访问分配的值:
ePasswordType var = ePasswordType.NUMBER;

int ValueOfEnum = var.getValue();

当你只知道整数时,使用以下代码获取枚举:

ePasswordType t = ePasswordType.fromInt(0);

Java中的枚举非常强大,因为每个值都可以是它自己的类。

6
这种做法比使用ordinal()要好得多。如果想了解原因,请阅读《Effective Java》。 - David Snabel-Caunt
@Kuffs:是否也有一种适当的方法通过使用整数值来设置枚举? - Levite
@Levit 这个值是在设计时设置的,而不是运行时。如果你的意思是当你只知道 int 值时检索枚举值,请参考我的编辑答案。 - Kuffs
2
@DavidSnabel-Caunt,能否麻烦您帮我省去购买Effective Java的费用和麻烦,只为了找出为什么ordinal()不好,并提供一份解释。 - Robin Davies
1
@robin-davies,看一下这个问题。https://dev59.com/q1cP5IYBdhLWcg3wRX9h - Kuffs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接