作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面是我想出的失败尝试,引用Java Generic Enum class using Reflection .
想找到更好的方法来做到这一点。我发现这种方法有几个问题:
每次我都需要传递类类型。示例 - EnumUtility.fromKey(Country.class, 1)
fromSet 在 City 和 Country 中都是重复的
public enum City implements BaseEnumInterface {
TOKYO(0), NEWYORK(1);
private final int key;
public static Set<Integer> fromValue(Set<City> enums) {
return enums.stream().map(City::getKey).collect(Collectors.toSet());
}
public int getKey() {
return key;
}
private City(int key) {
this.key = key;
}
}
public enum Country implements BaseEnumInterface {
USA(0), UK(1);
private final int key;
public static Set<Integer> fromSet(Set<Country> enums) {
return enums.stream().map(Country::getKey).collect(Collectors.toSet());
}
public int getKey() {
return key;
}
private Country(int key) {
this.key = key;
}
}
public class EnumUtility {
public static <E extends Enum<E> & BaseEnumInterface> E fromKey(Class<E> enumClass, Integer key) {
for (E type : enumClass.getEnumConstants()) {
if (key == type.getKey()) {
return type;
}
}
throw new IllegalArgumentException("Invalid enum type supplied");
}
public static <E extends Enum<E> & BaseEnumInterface> Set<Integer> fromSet(Class<E> enumClass, Set<E> enums) {
return enums.stream().map(BaseEnumInterface::getKey).collect(Collectors.toSet());
}
}
interface BaseEnumInterface {
int getKey();
}
public class EnumTester {
public static void main(String args[]) {
System.out.println(EnumUtility.fromKey(Country.class, 1));
}
}
最佳答案
无法避免将枚举类传递给 fromKey。您还怎么知道要检查请求的 key 的枚举常量?注意:该方法中的第二个参数应该是 int
类型,而不是 Integer。在 Integer 实例上使用 ==
不会比较数值,它会比较对象引用!
EnumUtility.fromSet 应该可以正常工作,因此每个枚举类根本不需要 fromSet 方法。请注意,EnumUtility.fromSet 根本不需要 Class 参数,实际上您的代码没有使用该参数。
关于使用 Java 8 默认方法和实用程序类的 Java 通用枚举功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43895415/
我是一名优秀的程序员,十分优秀!