在项目实际开发过程中,经常会遇到对某些固定的值、字典项的定义的需求,很多项目经常使用常量来定义,其实在jdk1.5就已经引入了枚举,使用枚举可以更好的解决这类需求,本文主要记录枚举的优势以及经常在项目中使用的方法。

知识点

  • 枚举类命名 枚举类的命名通常需要Enum为后缀,枚举成员名称需要全大写,单词间用下划线隔开。
  • 枚举类不允许使用 extends 关键字 枚举类默认会继承java.lang.Enum,由于java是单继承,所以在定义枚举类时不允许再继承其他类,但可以实现多个接口
  • 枚举的比较可以直接使用 枚举是不允许被new出来的,枚举类里的构造函数都限定为私有化,是不允许使用public定义构造函数的。枚举的赋值,如果是同一个元素,则会指向同一个地址,所以是可以直接使用==的,当然在Enum类中,重写了equals方法(如下图),所以也是可以用equals来判断。
  • 枚举常用方法
  • 枚举在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";
}

以上实例虽然实现了功能,但有两点比较明显的缺点:

  1. 常量值容易写错(特别是复制黏贴,但是忘记改对应的值,导致系统出bug),idea不会给任何提示。 比如,某人粗心,在复制黏贴代码时变成(将春季、夏季都定义成春季了):
/*** 春季*/
public static final String SPRING = "SPRING";
/*** 夏季*/
public static final String SUMMER = "SPRING";

  1. 如果我想知道一年总共多少个季节,咋整?用常量定义的类,有点捉襟见肘

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*/@Overridepublic 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获取sexNameString sexName = SexEnum.getSexNameByCode("women");System.out.println("根据sexCode获取sexName:" + sexName);//根据sexName获取sexCodeString sexCode = SexEnum.getSexCodeByName("男");System.out.println("根据sexName获取sexCode:" + sexCode);//通过传入的sexCode使用switchtestSexEnumSwitch("women");}/*** 实际项目中,基本上都是传sexCode的,所以这里也根据传入的sexCode,使用switch方法* @param sexCode*/private static void testSexEnumSwitch(String sexCode){//自定义getEnumByCode方法,通过sexCode获取SexEnumSexEnum 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();

源码获取

以上示例都可以通过我的GitHub获取完整的代码,点击获取

ios 获取一个枚举的所有值_Java enum枚举在实际项目中的常用方法相关推荐

  1. java获取word固定位置的值_java 实现保存Word文档中指定位置的数据,又保存整篇文档...

    1:需求 用户在线编辑完word 文档后希望保存整篇文档, 同时把保存文档中指定位置的数据 2:方案 用 pageoffice  实现既保存Word文档中指定位置的数据,又保存整篇文档 4:核心思想及 ...

  2. C#中如何获取一个字体的宽度值(像素单位)-获得文字的像素宽度

    C#中如何获取一个字体的宽度值(像素单位) 应用:减去了一个空格的长, 字符间距还是有点差距 private void listBox1_DrawItem(object sender, DrawIte ...

  3. ios 获取一个枚举的所有值_凯哥带你从零学大数据系列之Java篇---第十一章:枚举...

    温馨提示:如果想学扎实,一定要从头开始看凯哥的一系列文章(凯哥带你从零学大数据系列),千万不要从中间的某个部分开始看,知识前后是有很大关联,否则学习效果会打折扣. 系列文章第一篇是拥抱大数据:凯哥带你 ...

  4. 如何获取枚举字符串,值及遍历枚举(转)

    http://www.cnblogs.com/fanwenxuan/archive/2007/10/16/926019.html 枚举是一个特定的常量集合组成的独特类型 using System; p ...

  5. java 获取下拉框的值_java中怎么获取下拉框的值

    展开全部 JComboBox有一个getSelectedItem()的方法得到选择的值和一个getSelectedIndex()得到选择值的索引.636f70793231313335323631343 ...

  6. java enum 定义属性_java enum(枚举)使用详解 + 总结

    enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中. 下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容: 8. 总结 ...

  7. java枚举类型季节实例_Java之枚举类

    目录 一.为何引入枚举类型(为了替代魔法值) 什么是魔法值?魔法值有哪些隐患,见另一篇文章编码规约之使用Enum枚举类替代魔法值 那么为什么不用静态变量来替换魔法值呢? 有时候,变量的取值只在一个有限 ...

  8. 阿里云视频上传视频获取进度条问题(使用session方案,获取进度一直为0的解决方案)补充:前后端分离项目中获取进度解决方案

    1.场景描述: 之前用阿里云上传视频,前端反应上传视频经常出现获取视频url失败问题.但是接口我测过很多遍都是没有问题的.后台这边提供了一个视频上传的接口返回一个videoId,还提供了一个根据vid ...

  9. java中spring的级别_java – 在简单的示例项目中更改Spring框架日志级别?

    这是Spring Boot的工作,它通过slf4j处理日志路由jul,jcl和log4j,并通过slf4j使用Logback,正如您可以通过可区分的缩写命名空间类名称来判断的. 通过直接在pom文件上 ...

最新文章

  1. OpenCV 笔记(02)— 图像显示、保存、腐蚀、模糊、canny 边缘检测(imread、imshow、namedWindow、imwrite)
  2. NVIDIA 自动驾驶软件平台
  3. layui的css文件自己写的吗_安装教程和自己的使用tips
  4. 【练习题】构造方法的重载:Vehicles(交通工具)-Car(小汽车)和Truck(卡车)类继承于Vehicles类
  5. 使用PXE+VNC方式安装CentOS 7
  6. 基于Ubuntu环境使用docker搭建对于中文识别的chineseocr_lite项目
  7. s2 理论 第二套题
  8. 用QBE语言实现关系代数
  9. 【探路者】10月16日立会报告(团队第1周-第3次)
  10. 一起谈.NET技术,基于CallContextInitializer的WCF扩展导致的严重问题
  11. 随机效应估算与固定效应估算_纯电动汽车的电池价格,可以怎么估算?
  12. 韩顺平_JAVA_视频教程_下载(打开迅雷,直接复制链接地址即可下载)
  13. 2022年CISP考试题库下载
  14. flash用FlashPlayer将一个swf打包成exe
  15. wps文字下载 WPS Office 2012界面风格切换 想换就换
  16. 联想用u盘重装系统步骤_练习联想使用u盘重装win7教程
  17. 输入框字母自动转换大写
  18. 斯帅变阵只为讨好皇帝 36岁高龄大Z成热火首发
  19. 来看看你踩坑没有,新手做自媒体却没有收益?原因都在这5点
  20. postman传图片

热门文章

  1. 测验5: 函数和代码复用 (第5周)
  2. 《研磨设计模式》chap14 迭代器模式(1)简介
  3. C++ Primer 5th笔记(chap 14 重载运算和类型转换)下标运算符[]
  4. 查看Linux系统基本信息CPU内存系统负载
  5. Pycharm远程连接Linux服务器
  6. LPCTSTR 与 int 的互相转换
  7. C/C++编写的反向SHELL
  8. Savior:渗透测试报告自动生成工具
  9. DC-5 vulnhub靶机实战
  10. Windows保护模式学习笔记(六)—— 10-10-12分页