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

问题描述 投票:10回答:3

请参阅下面的代码。我有一个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 reflection enums deprecated
3个回答
5
投票

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

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());
    }
}

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());
    }
}

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;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.