Java:如何从外部初始化没有IF / SWITCH的枚举

时间:2019-03-13 17:03:29

标签: java enums

我有一个Enum,我想将其用作符号名(NORMAL,SPICY,HOT)及其关联值(11、22、33)之间的映射。

让我们说程序应该使用符号,并且数据库中存储的是值。

public static enum MyEnum
{ 
    NORMAL (11),        
    SPICY (22),     
    HOT (33);

    private int n;

    MyEnum (int n)    // must be a private constructor because of Java
    {
        this.n = n;
    }

    public static void initFromNumber (int n)
    {
        // ??? how to do that
    }

    public int get ()
    {
        return this.n;
    }
};

现在,我从数据库中读取并尝试创建/初始化枚举。

如何使用枚举(很明显,我可以使用一个类)来做到这一点而又没有很大的IF或SWITCH?有“优雅”的方式吗?

2 个答案:

答案 0 :(得分:1)

通常在我的应用程序中,我将遍历所有值并找到匹配的值。

public static MyEnum getByNumber(int n) {
    for (final MyEnum value : values()) {
        if (value.n == n) {
            return value;
        }
    }
    throw new IllegalArgumentException("No MyEnum found for n: " + n);
}

答案 1 :(得分:1)

Enum是单例,您不能仅对其进行初始化。您很可能希望通过数字获得枚举值。您可以使用流来做到这一点:

public static void initFromNumber (int n)
    MyEnum enumValue = Arrays.stream(MyEnum.values())
            .filter(myEnum -> myEnum.get() == n)
            .findFirst().orElseThrow();
}