枚举:根据属性获取成员
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)
-
方案:通过
for
循环,遍历所有枚举成员。 -
评价:每次调用方法都要从头遍历,效率低。
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)
-
方案:引入
map
作为字典,存储关键码和枚举成员的映射关系。 -
评价:字典初始化完成后可复用,效率高。
// 本例中,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); } }