Java如何根据整型序号获取enum枚举类的对应枚举值?
问题根因
Enum.valueOf() 方法的入参要求是枚举常量的名称字符串,比如你传"ADMIN"才能匹配到UserRole.ADMIN,你传入序号字符串"0"自然找不到对应的枚举常量,所以抛出非法参数异常。
是否需要修改枚举类分两种情况:临时使用无需修改,想要更安全、复用性更强的实现建议补充对应逻辑。
方案1:无需修改枚举类,直接使用内置方法
枚举类默认提供values()方法,会按照定义顺序返回包含所有枚举常量的数组,数组下标正好对应枚举的ordinal(内置序号)值,直接按下标取即可:
String role = "0"; // 先把字符串转成整型序号 int ordinal = Integer.parseInt(role); // 注意要加范围校验,避免数组越界 if (ordinal < 0 || ordinal >= UserRole.values().length) { throw new IllegalArgumentException("非法的角色序号:" + role); } UserRole userRole = UserRole.values()[ordinal];
方案2:在枚举类中封装专用查询方法(更推荐)
直接依赖ordinal有个隐患:如果后续调整枚举常量的定义顺序,ordinal的值会同步变化,如果你的序号已经持久化到数据库等存储中,会导致业务逻辑出错。更稳妥的方式是自定义业务编码字段,封装查询逻辑:
public enum UserRole { ADMIN(0), MANAGER(1), OPERATOR(2); // 自定义业务编码,和枚举定义顺序解耦 private final int roleCode; UserRole(int roleCode) { this.roleCode = roleCode; } public int getRoleCode() { return roleCode; } // 封装根据编码查询枚举的方法 public static UserRole getByRoleCode(int roleCode) { for (UserRole role : UserRole.values()) { if (role.roleCode == roleCode) { return role; } } throw new IllegalArgumentException("未找到对应角色,编码:" + roleCode); } }
使用方式如下:
String role = "0"; UserRole userRole = UserRole.getByRoleCode(Integer.parseInt(role));
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

