Java enum枚举在实际项目中的常用方法
在项目实际开发过程中,经常会遇到对某些固定的值、字典项的定义的需求,很多项目经常使用常量来定义,其实在jdk1.5就已经引入了枚举,使用枚举可以更好的解决这类需求,本文主要记录枚举的优势以及经常在项目中使用的方法。
知识点
- 枚举类命名
枚举类的命名通常需要Enum为后缀,枚举成员名称需要全大写,单词间用下划线隔开。 - 枚举类不允许使用 extends 关键字
枚举类默认会继承java.lang.Enum,由于java是单继承,所以在定义枚举类时不允许再继承其他类,但可以实现多个接口 - 枚举的比较可以直接使用 ==
枚举是不允许被new出来的,枚举类里的构造函数都限定为私有化,是不允许使用public定义构造函数的。枚举的赋值,如果是同一个元素,则会指向同一个地址,所以是可以直接使用==的,当然在Enum类中,重写了equals方法(如下图),所以也是可以用equals来判断。

- 枚举常用方法
| 方法名 | 用途 |
|---|---|
| name() | 返回枚举常量名 |
| toString() | 返回枚举常量名 |
| values() | 返回枚举成员数组 |
| valueOf() | 通过枚举常量名返回枚举 |
| ordinal() | 返回枚举常量在enum声明中的位置,位置是从0开始计数的 |
- 枚举在switch中的使用
枚举在switch中的使用,优势在于能控制case的范围(看以下实例),并且在idea中有相关提示 - 枚举在单例模式的使用
首先使用枚举类实现单例模式,写法相当简单,看最后的实例;其次枚举是线程安全、单一实例(由于构造方法都是私有的,不能被new)
实例
1. 最简单的枚举
在项目中经常会遇到一些固定值的定义,以往都是用常量来定义,以下用实例说明,为啥枚举的方式优于常量的方式,以下就以季节的定义为例
1.1 使用常量来实现
/**
* @Description: 季节常量定义
*/
public class SeasonConst {
/**
* 春季
*/
public static final String SPRING = "SPRING";
/**
* 夏季
*/
public static final String SUMMER = "SUMMER";
/**
* 秋季
*/
public static final String AUTUMN = "AUTUMN";
/**
* 冬季
*/
public static final String WINTER = "WINTER";
}
以上实例虽然实现了功能,但有两点比较明显的缺点:
- 常量值容易写错(特别是复制黏贴,但是忘记改对应的值,导致系统出bug),idea不会给任何提示。
比如,某人粗心,在复制黏贴代码时变成(将春季、夏季都定义成春季了):
/**
* 春季
*/
public static final String SPRING = "SPRING";
/**
* 夏季
*/
public static final String SUMMER = "SPRING";
- 如果我想知道一年总共多少个季节,咋整?用常量定义的类,有点捉襟见肘
1.2 使用枚举来实现,可以实现常量的所有功能,并能轻松解决以上提出的常量的两个缺点
- 定义枚举类SeasonEnum
public enum SeasonEnum {
/**
* 春季
*/
SPRING,
/**
* 夏季
*/
SUMMER,
/**
* 秋季
*/
AUTUMN,
/**
* 冬季
*/
WINTER
}
在SeasonEnum枚举类中,如果定义两个 SPRING,编译器会直接报错,很好解决了常量的第一个缺点
- 该枚举类的使用(1、获取枚举值的名称;2、枚举判断的使用;3、枚举循环的使用。通过枚举的循环,很好解决了常量的第二个缺点;)
//获取枚举值的名称,与toString得到的结果一样
String spring = SeasonEnum.SPRING.name();
System.out.println(spring);
//枚举判断的使用
SeasonEnum springEnum1 = SeasonEnum.SPRING;
SeasonEnum springEnum2 = SeasonEnum.SPRING;
SeasonEnum summerEnum3 = SeasonEnum.SUMMER;
//由于springEnum1、springEnum2都指向SPRING,所以输出true
System.out.println("springEnum1 == springEnum2:" + (springEnum1 == springEnum2));
//由于springEnum1指向SPRING、summerEnum3指向SUMMER,所以输出false
System.out.println("springEnum1 == summerEnum3:" + (springEnum1 == summerEnum3));
//循环枚举,打印枚举类中的所有枚举成员
SeasonEnum[] seasonEnums = SeasonEnum.values();
for (SeasonEnum seasonEnum : seasonEnums) {
System.out.println(seasonEnum.name());
}
- 枚举在switch中的使用,如果case后跟不存在SeasonEnum类中的枚举(比如 case OTHER),则编译器会报错
String enumName = "SPRING";
SeasonEnum seasonEnum = SeasonEnum.valueOf(enumName);
switch (seasonEnum){
case SPRING:
System.out.println(seasonEnum.name());
break;
case SUMMER:
System.out.println(seasonEnum.name());
break;
case AUTUMN:
System.out.println(seasonEnum.name());
break;
case WINTER:
System.out.println(seasonEnum.name());
break;
default:
System.out.println("other");
}
2.在枚举中使用自定义属性和方法
项目中经常也会遇到一些字典项的定义,比如性别,包含存入数据库中的值,以及显示在页面上的值。以下通过实例来实现性别字典。
- 定义SexEnum(注意看代码中的注解)
public enum SexEnum {
MAN("man","男"),
WOMEN("women","女");
private String sexCode;
private String sexName;
/**
* 自定义构造函数,以完成枚举对sexCode、sexName赋值
* @param sexCode
* @param sexName
*/
SexEnum(String sexCode,String sexName){
this.sexCode = sexCode;
this.sexName = sexName;
}
/**
* 获取sexCode
* @return
*/
public String getSexCode() {
return sexCode;
}
/**
* 获取sexName
* @return
*/
public String getSexName() {
return sexName;
}
/**
* 项目中经常会根据code,转换成对应的name
* 所以这里自定义方法,根据sexCode获取sexName
* 通过循环enum来实现
* @param sexCode
* @return
*/
public static String getSexNameByCode(String sexCode){
String sexName = "sexCode不存在";
SexEnum[] sexEnums = SexEnum.values();
for (SexEnum sexEnum : sexEnums) {
if(sexEnum.getSexCode().equals(sexCode)){
sexName = sexEnum.getSexName();
break;
}
}
return sexName;
}
/**
* 项目中也有根据name,转换成对应的code
* 所以这里自定义方法,根据sexName获取sexCode
* 通过循环enum来实现
* @param sexName
* @return
*/
public static String getSexCodeByName(String sexName){
String sexCode = "sexName不存在";
SexEnum[] sexEnums = SexEnum.values();
for (SexEnum sexEnum : sexEnums) {
if(sexEnum.getSexName().equals(sexName)){
sexCode = sexEnum.getSexCode();
break;
}
}
return sexCode;
}
/**
* 根据sexCode获取SexEnum,在switch中使用
* 通过循环enum来实现
* @param sexCode
* @return
*/
public static SexEnum getEnumByCode(String sexCode){
SexEnum[] sexEnums = SexEnum.values();
for (SexEnum sexEnum : sexEnums) {
if(sexEnum.getSexCode().equals(sexCode)){
return sexEnum;
}
}
return null;
}
/**
* 重写toString方法
* @return
*/
@Override
public String toString() {
return this.sexCode + ":" + this.sexName;
}
}
- SexEnum枚举类的使用
public class EnumMain {
public static void main(String[] args){
//循环带自定义方法的枚举
SexEnum[] sexEnums = SexEnum.values();
for (SexEnum sexEnum : sexEnums) {
System.out.println("sexCode:"+sexEnum.getSexCode());
System.out.println("sexName:"+sexEnum.getSexName());
System.out.println("sexCode:sexName="+sexEnum.toString());
}
//根据sexCode获取sexName
String sexName = SexEnum.getSexNameByCode("women");
System.out.println("根据sexCode获取sexName:" + sexName);
//根据sexName获取sexCode
String sexCode = SexEnum.getSexCodeByName("男");
System.out.println("根据sexName获取sexCode:" + sexCode);
//通过传入的sexCode使用switch
testSexEnumSwitch("women");
}
/**
* 实际项目中,基本上都是传sexCode的,所以这里也根据传入的sexCode,使用switch方法
* @param sexCode
*/
private static void testSexEnumSwitch(String sexCode){
//自定义getEnumByCode方法,通过sexCode获取SexEnum
SexEnum sexEnum = SexEnum.getEnumByCode(sexCode);
switch (sexEnum){
case MAN:
System.out.println(sexEnum.toString());
break;
case WOMEN:
System.out.println(sexEnum.toString());
break;
default:
System.out.println("other");
}
}
}
3.通过枚举实现单例
- 单例定义
public enum Singleton {
INSTALL;
/**
* 自定义方法
*/
public void yourMethod(){
System.out.println("do your business");
}
}
- 调用方法
Singleton.INSTALL.yourMethod();
源码获取
Java enum枚举在实际项目中的常用方法的更多相关文章
- 简单认识java enum枚举
什么是枚举 枚举是java5中新增的特性,他是一个特殊的数据类型,他的特殊性在于他既是一种类类型,又比类类型多了安全性,简洁性,便捷性.java枚举类型是功能十分强大齐全的类,功能比其他语言中的对等物 ...
- 161208、Java enum 枚举还可以这么用
在大部分编程语言中,枚举类型都会是一种常用而又必不可少的数据类型,Java中当然也不会例外.然而,Java中的Enum枚举类型却有着许多你意想不到的用法,下面让我们一起来看看. 先来看一段代码示例: ...
- Java enum枚举类型
java的枚举类型详解: 简单示例: public enum Color{ RED,BLUE,BLACK,YELLOW,GREEN } 复杂示例(带自定义构造方法与类型) public enum En ...
- Java Enum枚举的用法(转)
说明:Java的枚举比dotnet的枚举好用,至少支持的方式有很多. 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以 ...
- Java Enum 枚举的简单使用
一.什么是枚举 值类型的一种特殊形式,它从 System.Enum 继承,并为基础基元类型的值提供备用名称.枚举类型有名称.基础类型和一组字段.基础类型必须是一个内置的有符号(或无符号)整数类型(如 ...
- (转)java enum枚举
转载自: 原理:http://singleant.iteye.com/blog/686349 应用:http://www.cnblogs.com/happyPawpaw/archive/2013/04 ...
- Java Enum枚举 遍历判断 四种方式(包括 Lambda 表达式过滤)
示例代码如下: package com.miracle.luna.lambda; import java.util.Arrays; /** * @Author Miracle Luna * @Date ...
- java enum(枚举)的使用
在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集” ...
- java enum(枚举)使用详解 + 总结
enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容: 1. 原始 ...
随机推荐
- Exynos4412开发板-网络-同一网段
1.1 同一网段在不少实验中,都会需要用到局域网的一些基础知识,在技术支持的过程中,发现不少用户对于这个概念非常模糊,导致 IP 地址或者网络环境稍微有点变化,就无法实现实验.如果没有接触过这个概念, ...
- 54)PHP,访问修饰符
类外就是你再实例化成对象的时候 用你类里面的变量 继承的类内, 就是子类里面,但是实例化对象时,不能用 本类内, 只在本类的定义时用,子类不能用.
- [原]调试实战——使用windbg调试excel启动时死锁
原调试debugwindbg死锁deadlock 前言 这是几年前在项目中遇到的一个死锁问题,在博客园发布过.我对之前的笔记进行了整理重新发布于此. 本文假设小伙伴们知道一些基本概念,比如什么是.du ...
- COMET探索系列一【COMET实践笔记】
这几天在给公司的一个点对点聊天系统升级,之前只是使用简单的ajax轮询方式实现,每5秒钟取一次数据,延时太长,用户体验不是很好,因此打算采用服务器推送技术,故此整理了以下文档,将自己找到的一些资料及心 ...
- vue基本配置和生命周期
Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理.数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成.编译.挂着. ...
- Java基础 带你深刻理解自动装箱,拆箱含义
1.什么是装箱,什么是拆箱装箱:把基本数据类型转换为包装类.拆箱:把包装类转换为基本数据类型.基本数据类型所对应的包装类:int(几个字节4)- Integerbyte(1)- Byteshort(2 ...
- mysql获取按日期排序获取最新的记录
今天让一个数据查询难了.主要是对group by 理解的不够深入.才出现这样的情况 这种需求,我想很多人都遇到过.下面是我模拟我的内容表 我现在需要取出每个分类中最新的内容 select * from ...
- Spring中@Resorce和@Autowired的区别
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...
- unittest(9)- 使用ddt给测试用例传参
# 1. http_request.py import requests class HttpRequest: def http_request(self, url, method, data=Non ...
- 三年无限流量免费随身WiFi充电宝是真的还是套路?
一般来说大家现在看到"无限流量"."免费"等字眼,总会有一种"这是陷阱"."这是大坑"."就要黑你钱" ...