通过枚举属性获得枚举实例
2017-12-28 16:01
621 查看
有的公司喜欢在实体中使用枚举,但是落库落整型值,理由主要就是
1、整形比字符串省地方
2、如果是字符串,设置多长
像这样
我的看法是这样,
为了节省一点硬盘而在代码中反复进行int和enum的转换完全是得不偿失
而且枚举字面值可以保证唯一性,增加code以后增加了人为失误的可能性。
在使用orm框架的时候,很多程序员可能不会、不知道、不想去做自定义类型的处理器,因此造成int和enum的处理到处都是,并且特别恶心
另外,如果是枚举,我们直接使用==即可,使用int就有可能造成 int==Integer 的情况。
但是有的公司已经这么用了,可能暂时无法说服其他人,本身又不是很重要的问题,所以会妥协。
方式一 static map
方式二 反射
如果担心性能,可以考虑加个map
1、整形比字符串省地方
2、如果是字符串,设置多长
像这样
enum Gender { MALE(0), FEMALE(1); private int code; public int getCode() { return code; } private Gender(int code) { this.code = code; } }
我的看法是这样,
为了节省一点硬盘而在代码中反复进行int和enum的转换完全是得不偿失
而且枚举字面值可以保证唯一性,增加code以后增加了人为失误的可能性。
在使用orm框架的时候,很多程序员可能不会、不知道、不想去做自定义类型的处理器,因此造成int和enum的处理到处都是,并且特别恶心
另外,如果是枚举,我们直接使用==即可,使用int就有可能造成 int==Integer 的情况。
但是有的公司已经这么用了,可能暂时无法说服其他人,本身又不是很重要的问题,所以会妥协。
方式一 static map
enum Gender { MALE(0), FEMALE(1); private int code; private static final Map<Integer, Gender> MAP = new HashMap<>(); static { for (Gender item : Gender.values()) { MAP.put(item.code, item); } } public static Gender getByCode(String code) { return MAP.get(code); } public int getCode() { return code; } private Gender(int code) { this.code = code; } }
方式二 反射
public class EnumUtil { public static <E> E getByCode(Class<E> clz, int code) { try { for (E e : clz.getEnumConstants()) { Field field = clz.getDeclaredField("code"); field.setAccessible(true); if (Objects.equals(field.get(e), code)) { return e; } } } catch (Exception e) { throw new RuntimeException("根据code获取枚举实例异常" + clz + " code:" + code, e); } return null; } public static void main(String[] args) { System.out.println(EnumUtil.getByCode(Gender.class, 0)); } }
如果担心性能,可以考虑加个map
相关文章推荐
- 如何通过 SQLDMO 组件枚举可用的 SQLServer 实例
- 获得文件属性的函数调用实例
- 02_3中方式的反射,通过Class.forName获得Class对象,通过类.class获得字节码对象,通过类实例.getClass()的方式获得Class对象
- 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。请验证连接属性,并检查 SQL Server 的实例正在
- 【C#】回调方法不通过object参数获得委托实例
- WPF下通过附加属性实现单实例启动
- SpringMVC通过注解获得参数的实例
- C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值
- 02_3中方式的反射,通过Class.forName获得Class对象,通过类.class获得字节码对象,通过类实例.getClass()的方式获得Class对象
- 通过反射获得类的实例对象
- C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值
- Java中通过实例得到实体类中的属性和方法
- 通过枚举窗口获得窗口句柄名字并重命名窗口
- 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。请验证连接属性,并检查 SQL Server 的实例正在
- java 通过反射获得类的属性和调用方法
- JavaScript通过prototype给对象定义属性用法实例
- 通过实例代码讲述Hibernate中inverse属性与cascade属性相关知识
- Spring通过实现getBean方法获得Bean的实例
- ERROR:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。请验证连接属性,并检查 SQL Server 的实例正在主机上运行,且在此端口接受 TCP/IP 连
- 关于DialogResult.OK的“通过实例访问共享成员、常量成员、枚举成员或嵌套类型;将不计算限定表达式”的警告问题