是否有一种不那么冗长的方法来检索未弃用的枚举值?

时间:2014-01-17 15:27:42

标签: java reflection enums deprecated

请参阅下面的代码。我有一个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);
}
}

3 个答案:

答案 0 :(得分:5)

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

npm pack

答案 1 :(得分:1)

它没有那么大的区别,但您可以将您的分析放入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());
    }
}

答案 2 :(得分:0)

这是使用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;
    }
}