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