枚举:根据属性获取成员

1、枚举

枚举的使用

  • 在实际开发中,假如某个参数/变量具有一系列固定取值。
  • 通常会定义枚举类,而枚举成员是参数的所有取值。

示例

public enum EnvEnum {
    DEV(1, "开发环境"),
    TEST(2, "测试环境"),
    PROD(3, "生产环境"),
    ;

    private final Integer code;
    private final String env;

    EnvEnum(Integer code, String env) {
        this.code = code;
        this.env = env;
    }
}

2、根据属性获取成员

通常会遇到一个需求:根据属性获取枚举成员。

此时枚举类需要实现一个方法,来满足这个需求。

2.1、for 循环

时间复杂度O(n)

  1. 方案:通过 for 循环,遍历所有枚举成员。

  2. 评价:每次调用方法都要从头遍历,效率低。

    public enum EnvEnum {
        
        public static EnvEnum getEnvByCode(Integer code) {
            // 循环
            for (EnvEnum env : EnvEnum.values()) {
                if (Objects.equals(code, env.code)) {
                    return env;
                }
            }
            return null;
        }
    }
    

2.2、字典(❗)

时间复杂度O(1)

  1. 方案:引入 map 作为字典,存储关键码和枚举成员的映射关系。

  2. 评价字典初始化完成后可复用,效率高

    // 本例中,code可作为关键码
    
    public enum EnvEnum {
    
        private static final Map<Integer, EnvEnum> map;
    
        static {
            map = Arrays.stream(EnvEnum.values())
                .collect(Collectors.toMap(EnvEnum::getCode,
                                          UnaryOperator.identity()));
        }
    
        public static EnvEnum getEnvByCode(Integer code) {
            // 直接取值
            return map.get(code);
        }
    }
    
posted @ 2022-09-30 00:13  Jaywee  阅读(75)  评论(0编辑  收藏  举报

👇