【问题标题】:apache commons EnumUtils.isValidEnum(EnumClass, stringValue) shows wierd behaviorapache commons EnumUtils.isValidEnum(EnumClass, stringValue) 显示奇怪的行为
【发布时间】:2018-02-16 13:59:05
【问题描述】:

我有一个枚举,如下所示:

public enum EnumClass {
ValOne("ValOne."), ValTwo("ValTwo."), valone("ValOne"), valtwo("ValTwo."), ValThree("ValThree"), ValFour("ValFour"), ValFive("ValFive"), ValSix("ValSix");
private String enumValue;
private EnumClass(String value) {
    this.enumValue = value;
}
@Override
public String toString() {
    return this.enumValue;
}}

我正在使用

org.apache.commons.lang3.EnumUtils..isValidEnum(EnumClass, 字符串值)

我使用枚举值而不是枚举类的名称
(例如:“ValTwo。”而不是枚举“ValTwo”)
当我检查给定的字符串值是否等于枚举值时,它总是检查枚举对象的名称(即“ValTwo”)而不是 Enum.toString。 我的印象是它检查值而不是枚举对象本身。
奇怪的行为是,最初当我测试代码时,它检查的是值而不是名称。但是,在重建应用程序后,它正在检查名称。没有进行可能影响更改的代码更改。
任何投入将不胜感激。
提前致谢!!

【问题讨论】:

    标签: enums apache-commons-lang3


    【解决方案1】:

    我想我知道答案。 我检查了 EnumUtils.isValidEnum 的源代码

        public static <E extends Enum<E>> boolean isValidEnum(Class<E> enumClass, String enumName) {
        if (enumName == null) {
            return false;
        }
        try {
            Enum.valueOf(enumClass, enumName);
            return true;
        } catch (IllegalArgumentException ex) {
            return false;
        }
    }
    

    看起来它检查的是枚举成员而不是返回的值。!

    【讨论】:

      【解决方案2】:

      这可能对你有帮助,

       boolean isValid(Class enumClass, String value) {
                  return Arrays.stream(enumClass.getEnumConstants()).anyMatch((e) -> value.equals(
                          e.toString()));
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        • 1970-01-01
        • 2012-08-11
        • 1970-01-01
        • 2021-12-15
        相关资源
        最近更新 更多