
假设有这么一个枚举类
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); } 一把梭的通用解决方法 |