假设有这么一个枚举类
enum Color {
RED("R"), GREEN("G"), BLUE("B");
private String value;
private Color(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public static Color fromValue1(String value) {
for (Color color : Color.values()) {
if (color.getValue().equals(value)) {
return color;
}
}
throw new IllegalArgumentException("No color with value " + value);
}
public static Color fromValue2(String value) {
switch(value) {
case "R":
return RED;
case "G":
return GREEN;
case "B":
return BLUE;
default:
throw new IllegalArgumentException("No color with value " + value);
}
}
}
事情是这样的,对于枚举类不怎么变动的我一般会采用写法 2 ,看起来直观,复杂度也低一些,今天架构建议我采用写法 1 ,可以减少维护工作量
想调查一下大家一般会使用写法 1 还是写法 2 ?
1
xuanbg 2023-07-12 19:16:15 +08:00
Java 的枚举不是可以写 getName()方法返回"R"/"G"/"B"吗???
|
2
potatowish 2023-07-12 19:39:28 +08:00 via iPhone
一句代码就可以了,在不同枚举中可以直接复制
Arrays.stream(values).filter(e->e.value.equals(value)).findFirst().orElseThrow(()->new IllegalArgumentException("No color with value " + value)); |
3
season8 2023-07-12 19:41:00 +08:00 via Android
抖个机灵,还有更好维护的法子😂
``` public static <T extends Enum<T>,V> T toEnum(Function<T,V> matcher, V value, Class<T> enumClass) { T[] enumConstants = enumClass.getEnumConstants(); for (T enumConstant : enumConstants) { if (value.equals(matcher.apply(enumConstant))) { return enumConstant; } } throw new IllegalArgumentException("code is invalid"); } // 调用 toEnum(Color::getValue,"R") ``` |
4
tairan2006 2023-07-12 20:01:57 +08:00 via Android
|
5
Mmahaha OP @potatowish #2 曾经我也这么写过,但是后来觉得可读性太差了,后面就不这么搞了
|
6
Mmahaha OP |
7
zetaochen 2023-07-12 20:48:53 +08:00
肯定 1 啊,但我更习惯实现个 map ,在静态代码块里将东西都缓存到 map 里
|
8
traviszhou 2023-07-12 22:11:03 +08:00
1 ,后面加枚举的人就不用改动方法了
|
9
issakchill 2023-07-12 23:18:45 +08:00
同 7L 方法
|
10
WashFreshFresh 2023-07-13 15:23:09 +08:00
public static ElectronicSignaturePlatformEnum getConfig(String code) {
return Arrays.stream(ElectronicSignaturePlatformEnum.values()).filter(config -> Objects.equals(config.getCode(), code)). findAny().orElse(DEFAULT); } 一把梭的通用解决方法 |