文档章节

改善Java枚举类

Jnoee
 Jnoee
发布于 2015/02/25 13:20
字数 741
阅读 58
收藏 0
点赞 0
评论 0

#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两个属性,定义一个枚举类型接口 IEnum,如下:

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

创建 Sex (性别)的枚举类,实现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,可以参考这里 IEnumUserType.java

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

有了转换器,我们就不需要另外编写代码来处理枚举类了,就像在使用一个基本类型变量一样。它可以用来当作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即可。

© 著作权归作者所有

共有 人打赏支持
Jnoee
粉丝 4
博文 8
码字总数 5282
作品 0
深圳
架构师
java编程新手入门学习的基础语法

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰 ⋅ 05/28 ⋅ 0

为什么我墙裂建议大家使用枚举来实现单例

我们知道,单例模式,一般有七种写法,那么这七种写法中,最好的是哪一种呢?为什么呢?本文就来抽丝剥茧一下。 哪种写单例的方式最好 在StakcOverflow中,有一个关于What is an efficient ...

冷_6986 ⋅ 06/13 ⋅ 0

为什么我墙裂建议大家使用枚举来实现单例。

关于单例模式,我的博客中有很多文章介绍过。作为23种设计模式中最为常用的设计模式,单例模式并没有想象的那么简单。因为在设计单例的时候要考虑很多问题,比如线程安全问题、序列化对单例的...

⋅ 06/10 ⋅ 0

Java | enum 枚举类

simple 我们以用户状态写一个枚举类 测试类 效果 遍历 我们可以通过反射,或者通过提供的values()方法进行遍历。 测试代码: 效果: 使用 在写项目的时候,经常会用到枚举类。我们来写一个例...

Wenyi_Feng ⋅ 昨天 ⋅ 0

Kotlin2.3表示和处理选择:枚举和when

这一节讨论when的结构,它可以被认为是Java中switch结构的替代品,但是它更强大,也使用得更频繁。 2.3.1声明枚举类 声明一个简单的枚举类 这是极少数Kotlin声明比Java更多关键字的例子,在K...

无心下棋 ⋅ 05/12 ⋅ 0

Scala笔记整理(四):Scala面向对象—类详解2(继承相关)

[TOC] 单例 希望某个类只存在一个使用的对象,而不管有多少个调用者在使用它,就是单例的概念。 Java中的单例 Scala中的单例 代码及说明如下: 输出结果如下: 伴生类和伴生对象 直接看下面的...

xpleaf ⋅ 04/20 ⋅ 0

Effective Java 第三版——42.lambda表达式优于匿名类

Tips 《Effective Java, Third Edition》一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8...

M104 ⋅ 05/16 ⋅ 0

Effective Java 第三版——38. 使用接口模拟可扩展的枚举

Tips 《Effective Java, Third Edition》一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8...

M104 ⋅ 04/13 ⋅ 0

你所需要的java提升篇大总结

java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序的深入解析 java基础(五) Str...

sihailoveyan ⋅ 04/25 ⋅ 0

【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank ⋅ 06/21 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 50分钟前 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部