如何在Java中通过字符串值获取枚举值

2365

假设我有一个枚举类型,内容如下:

public enum Blah {
    A, B, C, D
}

我想要根据一个字符串找到对应的枚举值,例如 "A" 对应的是 Blah.A。有什么方法可以实现吗?

Enum.valueOf() 是我需要的方法吗?如果是,我该如何使用它?


1
这里有一个解决方案,不仅可以忽略大小写地执行此操作,而且将解决方案从O(N)移动到O(1):https://dev59.com/Ll4c5IYBdhLWcg3wFW6N#74408971 - chaotic3quilibrium
32个回答

0

Kotlin解决方案

创建一个扩展函数,然后调用valueOf<MyEnum>("value")。如果类型无效,则会返回null,需要进行处理。

inline fun <reified T : Enum<T>> valueOf(type: String): T? {
    return try {
        java.lang.Enum.valueOf(T::class.java, type)
    } catch (e: Exception) {
        null
    }
}

或者,您可以设置默认值,调用valueOf<MyEnum>("value", MyEnum.FALLBACK),避免出现空响应。您可以扩展特定的枚举类型以使默认值自动化。

inline fun <reified T : Enum<T>> valueOf(type: String, default: T): T {
    return try {
        java.lang.Enum.valueOf(T::class.java, type)
    } catch (e: Exception) {
        default
    }
}

或者如果你想要两个,就把第二个加上:

inline fun <reified T : Enum<T>> valueOf(type: String, default: T): T = valueOf<T>(type) ?: default

0
public enum DivisionType {
DEFAULT(0){
    @Override
    public void sort(List<SigInUserDto> SigInUserDtos) {
        SigInUserDtos.sort(new SigInUserCoinsQueueComparator());
    }
},
ASSIGNPOINTS(1) {
    @Override
    public void sort(List<SigInUserDto> SigInUserDtos) {
        SigInUserDtos.sort(new SigInUserPointsComparator());
    }
},
ASSIGNEVENORDER(2) {
    @Override
    public void sort(List<SigInUserDto> SigInUserDtos) {
        SigInUserDtos.sort(new SigInUserOrderCountComparator());
    }
};

public final Integer label;

DivisionType(Integer label) {
    this.label = label;
}

public static DivisionType getTypeById(Integer id) {
    for (DivisionType value : DivisionType.values()) {
        if (value.label == id) {
            return value;
        }
    }
    return DEFAULT;
}

public abstract void sort(List<SigInUserDto> SigInUserDtos);
}

使用枚举: DivisionType.getTypeById(object.getBalancingTypesId().intValue()).sort(sigInUserDtoList);
这里,sort()函数在每个枚举匹配下都被实现(重载)。 因此,根据对象“object.getBalancingTypesId().intValue()”匹配的值,特定枚举匹配被调用并排序。

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