关于代码中枚举实例获取方式的习惯问题

302 天前
 Mmahaha

假设有这么一个枚举类

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 ?

1090 次点击
所在节点    程序员
10 条回复
xuanbg
302 天前
Java 的枚举不是可以写 getName()方法返回"R"/"G"/"B"吗???
potatowish
302 天前
一句代码就可以了,在不同枚举中可以直接复制
Arrays.stream(values).filter(e->e.value.equals(value)).findFirst().orElseThrow(()->new IllegalArgumentException("No color with value " + value));
season8
302 天前
抖个机灵,还有更好维护的法子😂
```
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")
```
tairan2006
302 天前
Mmahaha
302 天前
@potatowish #2 曾经我也这么写过,但是后来觉得可读性太差了,后面就不这么搞了
Mmahaha
302 天前
@tairan2006 #4 学习了
@season8 #3 骚气
zetaochen
302 天前
肯定 1 啊,但我更习惯实现个 map ,在静态代码块里将东西都缓存到 map 里
traviszhou
302 天前
1 ,后面加枚举的人就不用改动方法了
issakchill
302 天前
同 7L 方法
WashFreshFresh
301 天前
public static ElectronicSignaturePlatformEnum getConfig(String code) {
return Arrays.stream(ElectronicSignaturePlatformEnum.values()).filter(config -> Objects.equals(config.getCode(), code)).
findAny().orElse(DEFAULT);
}
一把梭的通用解决方法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/956256

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX