【问题标题】:Is there a less verbose way to retrieve non deprecated enum values?是否有一种不那么冗长的方法来检索非弃用的枚举值?
【发布时间】:2014-01-17 15:27:41
【问题描述】:

请参阅下面的代码。我有一个enum,其中一些值被标记为已弃用。我需要 Collection 的所有未弃用的 enum 值。 我设法使用反射完成了这项任务,但对我来说它看起来太冗长了。 有没有更简洁的方法来定义 @Deprecated 标签的存在?

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class DeprecatedEnumValues {

public enum MyEnum {
    AA,
    BB,
    @Deprecated CC,
    DD,
    @Deprecated EE,
}

public static void main(String[] args) {

    List<MyEnum> myNonDeprecatedEnumValues = new ArrayList<MyEnum>();

    for (Field field : MyEnum.class.getDeclaredFields()) {
        if (field.isEnumConstant() && !field.isAnnotationPresent(Deprecated.class)) {
            myNonDeprecatedEnumValues.add(MyEnum.valueOf(field.getName()));
        }
    }
    System.out.println(myNonDeprecatedEnumValues);
}
}

【问题讨论】:

  • 这对我来说并不是很冗长(对于 Java)。我没有在 Java 中大量使用反射,但我就是这样做的。
  • 我会使用 &amp;&amp; 而不是 &amp; 但否则只使用较短的名称会使其更短。
  • @PeterLawrey,谢谢。星期五下午我的编码准确性有点草率;-) 我将编辑示例代码。
  • 有一瞬间我以为你发明了 AND-NOT 运算符&amp;!

标签: java reflection enums deprecated


【解决方案1】:

这是使用流的更简洁的解决方案:

public enum MyEnum {
    AA,
    BB,
    @Deprecated CC,
    DD,
    @Deprecated EE,

    /**
     * Retrieve enum values without the @Deprecated annotation
     */
    public static List<MyEnum> nonDeprecatedValues() {
        return Arrays.stream(MyEnum.values()).filter(value -> {
            try {
                Field field = MyEnum.class.getField(value.name());
                return !field.isAnnotationPresent(Deprecated.class);
            } catch (NoSuchFieldException | SecurityException e) {
                return false;
            }
        }).collect(Collectors.toList());
    }
}

【讨论】:

    【解决方案2】:

    差别不大,但您可以将分析放入enum 本身,这样使用起来更方便,if 子句也变得更简单:

    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.List;
    
    public class DeprecatedEnumValues {
    
        public enum MyEnum {
            AA, 
            BB, 
            @Deprecated CC, 
            DD, 
            @Deprecated EE;
    
            public static List<MyEnum> getNonDepricatedEnumValues(){
                List<MyEnum> myNonDeprecatedEnumValues = new ArrayList<MyEnum>();
    
                for (MyEnum enumValue : MyEnum.values())
                    try {
                        Field field = MyEnum.class.getField(enumValue.name());                      
                        if (field.isAnnotationPresent(Deprecated.class))
                            continue;
    
                        myNonDeprecatedEnumValues.add(enumValue);                   
                    } catch (NoSuchFieldException | SecurityException e) {}
                    // both cannot occure here..
    
                return myNonDeprecatedEnumValues;
            }
        }
    
        public static void main(String[] args) {
            System.out.println(MyEnum.getNonDepricatedEnumValues());
        }
    }
    

    【讨论】:

    • 很好,但我无法更改 Enum 的代码,因为它是库的一部分。
    • 您可以在枚举本身之外的方法中执行相同的操作。只需将方法移动到您自己的代码中即可。
    【解决方案3】:

    这是使用 static 块和 Java 8 流获取非弃用枚举的最有效实现。

    import java.lang.reflect.Field;
    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    
    public enum MyEnum {
        AA,
        BB,
        @Deprecated
        CC,
        DD,
        @Deprecated
        EE;
    
        private static List<MyEnum> nonDeprecatedEnums;
    
        static {
            nonDeprecatedEnums = Arrays.stream(MyEnum.values()).filter(value -> {
                try {
                    Field field = MyEnum.class.getField(value.name());
                    return !field.isAnnotationPresent(Deprecated.class);
                } catch (NoSuchFieldException | SecurityException e) {
                    return false;
                }
            }).collect(Collectors.toList());
        }
    
        /**
         * Retrieve enum values without the @Deprecated annotation
         */
    
        public static List<MyEnum> getNonDeprecatedEnums() {
            return nonDeprecatedEnums;
        }
    }
    

    【讨论】:

    • 非常令人印象深刻
    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2016-11-15
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多