V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Mmahaha
V2EX  ›  程序员

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

  •  1
     
  •   Mmahaha · 2023-07-12 19:11:18 +08:00 · 1232 次点击
    这是一个创建于 495 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设有这么一个枚举类

    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 ?

    10 条回复    2023-07-13 15:23:09 +08:00
    xuanbg
        1
    xuanbg  
       2023-07-12 19:16:15 +08:00
    Java 的枚举不是可以写 getName()方法返回"R"/"G"/"B"吗???
    potatowish
        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));
    season8
        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")
    ```
    tairan2006
        4
    tairan2006  
       2023-07-12 20:01:57 +08:00 via Android
    Mmahaha
        5
    Mmahaha  
    OP
       2023-07-12 20:39:25 +08:00
    @potatowish #2 曾经我也这么写过,但是后来觉得可读性太差了,后面就不这么搞了
    Mmahaha
        6
    Mmahaha  
    OP
       2023-07-12 20:42:32 +08:00
    @tairan2006 #4 学习了
    @season8 #3 骚气
    zetaochen
        7
    zetaochen  
       2023-07-12 20:48:53 +08:00
    肯定 1 啊,但我更习惯实现个 map ,在静态代码块里将东西都缓存到 map 里
    traviszhou
        8
    traviszhou  
       2023-07-12 22:11:03 +08:00
    1 ,后面加枚举的人就不用改动方法了
    issakchill
        9
    issakchill  
       2023-07-12 23:18:45 +08:00
    同 7L 方法
    WashFreshFresh
        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);
    }
    一把梭的通用解决方法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1022 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 20:35 · PVG 04:35 · LAX 12:35 · JFK 15:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.