博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
改善Java枚举类
阅读量:7096 次
发布时间:2019-06-28

本文共 1534 字,大约阅读时间需要 5 分钟。

  hot3.png

#1. Java默认枚举类存在的问题 Java的枚举类的设计不能很好的满足中文应用的需求,因为它只提供了2个属性:name(String)和ordinal(Integer)。 而我们在应用枚举时通常需要3个属性:

  • name(String):英文名称,编码时用,可以沿用Java枚举的name。
  • text(String):枚举文本,用于在页面显示。
  • value(String):枚举值,用于数据库存储。

以最常见的 Sex(性别) 枚举类来举例:

  • name:MALE/FEMALE
  • text:男/女
  • value:1/2

这是一个在应用中经常遇见的需求,从上面的例子可以看到,text在Java枚举类中没有对应属性,而value用ordinal又不合适。这样我们需要在枚举类中定义text和value两个属性,以满足应用的需求。为了能够统一的处理这样的枚举类型,首先得定义一个枚举类的接口,因为枚举类是内置的不支持继承。

#2. 创建一个枚举类型接口 从上面的需求看到,应用真正需要使用的是text和value两个属性,定义一个枚举类型接口 ,如下:

public interface IEnum {    String getText();    String getValue();}

创建 (性别)的枚举类,实现IEnum接口,如下:

public enum Sex implements IEnum {    MALE("男", "1"), FEMALE("女", "2");    private String text;    private String value;    private Sex(String text, String value) {        this.text = text;        this.value = value;    }    @Override    public String getText() {        return text;    }    @Override    public String getValue() {        return value;    }}

#3. 创建对应的转换器 如果使用Hibernate,为了在数据层透明的存取自定义枚举类型,需要创建针对该枚举类型的UserType,可以参考这里 。

如果使用Spring MVC,为了在表现层透明的传递自定义枚举类型,需要创建针对该枚举类型的Converter,可以参考这里 和 。

有了转换器,我们就不需要另外编写代码来处理枚举类了,就像在使用一个基本类型变量一样。它可以用来当作Entity属性类型,也可以在页面的下拉列表或单选、多选框组件中方便的使用。

#4. 使用自定义枚举类 在Entity类User中使用Sex枚举类型作为属性,如下:

@Entity@Table(name = "Tmp_User")public class User extends UuidEntity {    ...    @Type(type = "IEnum")    private Sex sex = Sex.MALE;    ...}

在数据库中存入value值,在页面上展示text值,freemarker中可以这样写:${user.sex.text}。如果需要在页面上显示一个下拉列表让用户选择性别,也很简单:通过Sex.values()方法可以拿到枚举列表,循环枚举列表用valuetext值填充options即可。

转载于:https://my.oschina.net/jnoee/blog/379860

你可能感兴趣的文章
CnetOS启动流程
查看>>
LVM扩缩--lvm缩小swap,根分区在线扩容
查看>>
C++模板学习
查看>>
我的php学习笔记:php通用采集程序
查看>>
Ruby-数字&字符串
查看>>
iptables -F 与 -X 区别
查看>>
網路壅塞引發的後續問題
查看>>
Java 解惑手册 读书笔记
查看>>
罗森伯格参编中国综合布线系统工程国家标准
查看>>
mysql创建表时指定存储目录
查看>>
活动目录实战之九 windows 2008 r2 AD 站点的规划
查看>>
我的友情链接
查看>>
Myeclipse.10的汉化步骤
查看>>
sed命令
查看>>
RAC 网路结构 network
查看>>
现代软件工程讲义 6 用户调研
查看>>
java基础学习第1天笔记
查看>>
linux基础常用之显示,创建,复制,移动,删除
查看>>
RGB与YUV
查看>>
openstack安装windows虚拟机的方法(Hyperisor为kvm)
查看>>