目录

Java 枚举(enum)概述

枚举常量 & values 遍历

枚举属性、方法、参数

枚举实现接口

枚举定义抽象方法

在工具类中维护多个枚举


Java 枚举(enum)概述

1、Java JDK 1.5 新增的 enum 关键词,可以定义枚举类,如 public enum WeekEnum { }.

2、使用 enum 定义后的枚举类在编译后默认继承 java.lang.Enum 类,而不是普通的继承 Object 类。由于 Java 不支持多继承,所以枚举不能再显示的继承其他类,但是可以实现接口。

3、Enum 类默认实现了 Java.lang.Comparable 接口与 Serializable 接口

4、Enum 类重写了 toString 方法,返回声明中包含的此枚举常量的名称。

5、enum 声明后,该类会被编译器加上 final 声明(如同 String),故枚举无法被继承。

6、枚举类内部定义的枚举值就是该类的实例,且必须在第一行定义,当类初始化时,这些枚举值会被实例化,互相以逗号分隔。 如 "Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday"

7、每个枚举类都有一个 values 方法,该方法可以遍历枚举类的所有实例.

8、枚举规定好了指定的取值范围,所有的内容只能从指定的范围中取得。

9、枚举是一种类型,用于定义变量,以限制变量的赋值;通过 "枚举名.值" 取得枚举值,每个值都是一个 Enum 实例

10、枚举是一个特殊的类,可以定义自己的 field(包括静态属性)、方法(包括静态方法)、可以实现接口,也可以定义自己的构造器。

11、枚举类的构造方法默认用 private 修饰的,且不能出现 public 构造方法,因此无法 new 一个枚举对象。

13、实际编程中往往存在着这样的 "数据集",它们的数值是稳定的、元素个数是有限的,例如星期一到星期日,春夏秋冬四季等等,很多时候大家选择使用常量。 JDK 1.5 开始有了枚举,其实可以把相关的常量放到一个枚举类型里,枚举提供了比常量更多的方法,使用起来更加方便。

枚举的构造器私有,每一个枚举值都是一个枚举实例,编译后自动产生。

枚举值的参数与构造器的参数相对应:

枚举值后面没跟参数时,对应构造器的无参构造,
  枚举值后面有跟参数时,必须要有参数个数且类型相同的构造器与之对应,以及设置相应的成员变量。

枚举编译构建实例顺序:枚举值后面的实参值->找到对应的构造方法->注入给相应的成员变量。因为构造器可以重载,所以枚举值后面的参数可以不同,包括类型与个数。
每个枚举值既可以调用自己独有的属性,即后面的参数值,也可以调用公共的属性,即可调用自己下面独有的方法,也可调用公共的方法。
当枚举值/枚举常量没有带参数时,则没必要构造器,反之如果枚举值有参数,则必须有构造器与之对应。

枚举常量 & values 遍历

1、定义枚举

public enum WeekEnum {/*** 最简单的枚举形式,使用逗号分隔,结尾分号此时可以省略* 每一个值都代表当前的枚举实例,通过 枚举名.值 获取*/Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}

src/main/java/org/example/enums/WeekEnum1.java · 汪少棠/java-se - Gitee.com

2、测试枚举:

public class WeekEnumTest {public static void main(String[] args) {//类似静态类,也是 枚举名.值 直接获取,每个值都是 Enum 实例WeekEnum sundayEnum = WeekEnum.Sunday;//因为 Enum 重写了 toString 方法,方法中返回 name 属性//输出 SundaySystem.out.println("WeekEnum.Sunday=" + sundayEnum.toString());//返回此枚举常量的名称,与其枚举声明中声明的完全相同,看源码一目了然//输出 SundaySystem.out.println("weekEnum.name()=" + sundayEnum.name());switch (sundayEnum) {case Monday:System.out.println("星期1");break;case Friday:System.out.println("星期5");break;case Sunday://会输出System.out.println("星期7");}//每个枚举类都有一个 values 方法,可以遍历枚举类的所有 Enum 实例.WeekEnum[] weekEnums = WeekEnum.values();for (WeekEnum weekEnum_loop : weekEnums) {//ordinal():返回此枚举常数的序号(就是在枚举声明中的位置,从0开始)。System.out.print(weekEnum_loop.ordinal() + ":" + weekEnum_loop.name() + "  ");}/*** compareTo:看源码一目了然,就是根据序号 ordinal 对比同类型的枚举值是否相等* 自己的序号减去对比项的序号,如果为0则相等,否则就是正负数。注意只能对比相同枚举类型*/WeekEnum mondayEnum = WeekEnum.Monday;int flag1 = sundayEnum.compareTo(mondayEnum);int flag2 = sundayEnum.compareTo(WeekEnum.Sunday);//输出 6、0System.out.println("\n" + flag1 + "、" + flag2);}
}

src/main/java/org/example/enums/WeekEnumTest1.java · 汪少棠/java-se - Gitee.com

枚举属性、方法、参数

1、枚举像普通的类一样可以添加属性和方法(包括静态或非静态的属性或方法)。注意枚举值要写在最前面,且以分号结尾,否则编译出错。

2、枚举常量后面可以接括号定义枚举参数,这些参数会通过对应的构造器自动给属性赋值。"枚举参数 -> 对应的构造器 -> 属性" 完成赋值。

public enum WeekEnum2 {/*** 枚举值写在最前面,有其他内容时,必须以分号结尾。* 因为枚举只能通过常量获取枚举实例,所以枚举参数必须与构造器中的参数对应* 匹配两个参数的构造器创建 1-6 实例* 匹配三个参数的构造器创建 Sunday 实例*/Monday(1, "星期一"),Tuesday(2, "星期二"),Wednesday(3, "星期三"),Thursday(4, "星期四"),Friday(5, "星期五"),Saturday(6, "星期六"),Sunday(7, "星期天", "周末");/*** 属性名称可以随便取,只需要构造器中的参数类型必须与上面的枚举参数类型对应*/private Integer code;private String name;private String ext;/*** 支持定义静态属性*/public static String summary;/*** 构造器默认是 private ,外部无法 new 枚举对象,只能通过上面的常量获取实例,必须与枚举参数对应** @param code* @param name*/WeekEnum2(Integer code, String name) {this.code = code;this.name = name;}WeekEnum2(Integer code, String name, String ext) {this.code = code;this.name = name;this.ext = ext;}/*** 因为枚举常量的参数都是通过内部私有的构造器赋值的,无法通过外部赋值,所以没必要提供 setter方法* 但是可以提供 getter 方法来获取枚举参数值** @return*/public Integer getCode() {return code;}public String getName() {return name;}public String getExt() {return ext;}/*** 获取工作日 周一到周五-----支持静态方法** @return*/public static Set<WeekEnum2> getWorkDays() {Set<WeekEnum2> workDays = new HashSet<>(5);workDays.add(WeekEnum2.Monday);workDays.add(WeekEnum2.Tuesday);workDays.add(WeekEnum2.Wednesday);workDays.add(WeekEnum2.Thursday);workDays.add(WeekEnum2.Friday);return workDays;}
}

src/main/java/org/example/enums/WeekEnum2.java · 汪少棠/java-se - Gitee.com

2、测试代码:

public class WeekEnum2Test {public static void main(String[] args) {// 枚举名.值 获取实例,这些值之所以叫枚举常量,因为它的值就如同常量一样一开始就顶死了的,无法修改WeekEnum2 sundayEnum = WeekEnum2.Sunday;WeekEnum2 mondayEnum = WeekEnum2.Monday;//上面的实例包含了自己枚举参数,所以可以通过 getter 方法获取// 7->星期天->周末System.out.println(sundayEnum.getCode() + "->" + sundayEnum.getName() + "->" + sundayEnum.getExt());// 1->星期一->null  ,因为星期一没有提供 ext 参数,所以为 nullSystem.out.println(mondayEnum.getCode() + "->" + mondayEnum.getName() + "->" + mondayEnum.getExt());Set<WeekEnum2> workDays = WeekEnum2.getWorkDays();// [Tuesday, Friday, Wednesday, Thursday, Monday]System.out.println(workDays);WeekEnum2.summary = "蚩尤后裔";// 蚩尤后裔System.out.println(WeekEnum2.summary);}
}

src/main/java/org/example/enums/WeekEnum2Test.java · 汪少棠/java-se - Gitee.com

枚举实现接口

1、先准备一个接口:

import java.util.Map;
public interface WeekEnumInterface {Integer getCode();String getName();Map<String, Object> getDataMap();
}

src/main/java/org/example/enums/WeekEnum3Interface.java · 汪少棠/java-se - Gitee.com

2、定义枚举并实现接口

public enum WeekEnum3 implements WeekEnum3Interface {//枚举值写在最前面,有其他内容时,必须以分号结尾。//因为枚举只能通过常量获取枚举实例,所以枚举参数必须与构造器中的参数对应//匹配两个参数的构造器创建实例Monday(1, "星期一"),Tuesday(2, "星期二"),Wednesday(3, "星期三"),Thursday(4, "星期四"),Friday(5, "星期五"),Saturday(6, "星期六"),Sunday(7, "星期天");/*** 属性名称可以随便取,但是构造器中的参数类型必须与上面的枚举参数类型对应*/private Integer code;private String name;/*** 构造器默认是 private ,外部无法 new 枚举对象,只能通过上面的常量获取实例,必须与枚举参数对应** @param code* @param name*/WeekEnum3(Integer code, String name) {this.code = code;this.name = name;}@Overridepublic Integer getCode() {return this.code;}@Overridepublic String getName() {return this.name;}/*** 将整个枚举参数转为 Map 结构** @return*/@Overridepublic Map<String, Object> getDataMap() {Map<String, Object> dataMap = new HashMap<>(WeekEnum3.values().length);for (WeekEnum3 weekEnum : WeekEnum3.values()) {dataMap.put(weekEnum.code + "", weekEnum.name);}return dataMap;}
}

src/main/java/org/example/enums/WeekEnum3.java · 汪少棠/java-se - Gitee.com

3、测试代码:

public class WeekEnum3Test {public static void main(String[] args) {// 枚举名.值 获取实例,这些值之所以叫枚举常量,因为它的值就如同常量一样一开始就顶死了的,无法修改WeekEnum3 sundayEnum = WeekEnum3.Sunday;// 7 - 星期天System.out.println(sundayEnum.getCode() + " - " + sundayEnum.getName());Map<String, Object> dataMap = sundayEnum.getDataMap();// {1=星期一, 2=星期二, 3=星期三, 4=星期四, 5=星期五, 6=星期六, 7=星期天}System.out.println(dataMap);}
}

src/main/java/org/example/enums/WeekEnum3Test.java · 汪少棠/java-se - Gitee.com

枚举定义抽象方法

1、枚举中可以有抽象方法,且由枚举值/枚举常量提供方法实现。枚举类如下:

public enum WeekEnum4 {/*** 枚举值写在最前面,有其他内容时,必须以分号结尾。* 因为枚举只能通过常量获取枚举实例,所以枚举参数必须与构造器中的参数对应*/Monday(1, "星期一") {@Overridepublic String toSplitString() {return Monday.code + "," + Monday.name;}},Tuesday(2, "星期二") {@Overridepublic String toSplitString() {return Tuesday.getCode() + "," + Tuesday.getName();}};/*** 属性名称可以随便取,但是构造器中的参数类型必须与上面的枚举参数类型对应*/private Integer code;private String name;/*** 构造器默认是 private ,外部无法 new 枚举对象,只能通过上面的常量获取实例,必须与枚举参数对应** @param code* @param name*/WeekEnum4(Integer code, String name) {this.code = code;this.name = name;}public Integer getCode() {return code;}public String getName() {return name;}/*** 方法要是 public 修饰外部才能调用** @return*/public abstract String toSplitString();
}

2、测试代码:

public class WeekEnum4Test {public static void main(String[] args) {//枚举名.值 获取实例,这些值之所以叫枚举常量,因为它的值就如同常量一样一开始就顶死了的,无法修改WeekEnum4 mondayEnum = WeekEnum4.Monday;WeekEnum4 tuesdayEnum = WeekEnum4.Tuesday;// 输出:1 - 星期一System.out.println(mondayEnum.getCode() + " - " + mondayEnum.getName());// 输出:2 - 星期二System.out.println(tuesdayEnum.getCode() + " - " + tuesdayEnum.getName());// 输出:1,星期一System.out.println(mondayEnum.toSplitString());// 输出:2,星期二System.out.println(tuesdayEnum.toSplitString());}
}

在工具类中维护多个枚举

public class EnumComm {/*** 红绿灯颜色枚举*/public enum ColorEnum {Red("red", "红色"),Yellow("yellow", "黄色"),Green("green", "绿色");private String code;private String name;ColorEnum(String code, String name) {this.code = code;this.name = name;}public String getCode() {return code;}public String getName() {return name;}}/*** 系统上线省份枚举*/public enum AreaEnum {HuNan("43", "湖南"),HeNan("41", "河南"),LiaoNiang("21", "辽宁");private String code;private String name;AreaEnum(String code, String name) {this.code = code;this.name = name;}public String getCode() {return code;}public String getName() {return name;}}
}
public class EnumCommTest {public static void main(String[] args) {EnumComm.AreaEnum huNan = EnumComm.AreaEnum.HuNan;// 43:湖南System.out.println(huNan.getCode() + ":" + huNan.getName());EnumComm.ColorEnum yellow = EnumComm.ColorEnum.Yellow;// yellow:黄色System.out.println(yellow.getCode() + ":" + yellow.getName());}
}

src/main/java/org/example/enums/EnumComm.java · 汪少棠/java-se - Gitee.com

src/main/java/org/example/enums/EnumCommTest.java · 汪少棠/java-se - Gitee.com

Java 枚举(enum)剖析相关推荐

  1. Java枚举(Enum)类型使用的正确姿势

    关于Java Enum的介绍及原理参见 Java枚举(Enum)类型的基本介绍与原理探求 Enum类型的基本使用 定义一个枚举类的主要作用就是在逻辑代码中对某个变量的值进行比较.同样以季节的枚举类Se ...

  2. Java 枚举(enum) 7种常见的用法

    在JDK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便. 用法一:常量 在JDK1.5 之前,我们定义常量都是 ...

  3. Java枚举(enum)常用的用法总结

    Java枚举[enum] Java枚举(enum)七种常见的用法汇总如下: 用法一:常量 用法二:switch 用法三:向枚举中添加新方法 用法四:覆盖枚举的方法 用法五:实现接口 用法六:使用接口组 ...

  4. [转载] java 枚举Enum源码解析

    参考链接: 使用Java枚举 应用场景 枚举是单例模式中的一种.面试官系统之设计模式(单例模式) 简单来讲就是只能实例化一次,线程安全且性能高.枚举通常用来列举一个类型的有限实例集合,我们可以使用常量 ...

  5. Java 枚举(enum)

    Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等. Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 ...

  6. Java枚举(Enum)类型的基本介绍与原理探求

    Enum枚举类型 Enum的全写是Enumeration,这个词的翻译是列举.逐条陈述.细目.在程序语言中,枚举类型是一种特殊的数据类型(常用的数据类型比如字符串.整型),这种数据类型的变量值限定在固 ...

  7. Java 枚举(enum) 详解7种常见的用法<详细>

    JDK1.5引入了新的类型--枚举.在 Java 中它虽然算个"小"功能,却给我的开发带来了"大"方便. 大师兄我[大师兄]又加上自己的理解,来帮助各位理解一下 ...

  8. Java 枚举(enum) 详解7种常见的用法-小白笔记

    目录 用法一:常量 用法二:switch 用法三:向枚举中添加新方法 用法四:覆盖枚举的方法 用法五:实现接口 用法六:使用接口组织枚举 用法七:关于枚举集合的使用 用法一:常量 在JDK1.5 之前 ...

  9. Java 枚举(enum) 六种常用的方法详解

    JDK1.5引入了新的类型--枚举,在java中虽然枚举只是一个很小的功能,却给我们带来了很大的方便. 首先我们要了解几个概念,enum是没有构造函数的,准确的来说是没有public类型的构造函数, ...

  10. Java (枚举) Enum 详解

    枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数.枚举在日常生活中很常见,例如表示星期的SUNDAY.MONDAY.TUESDAY.WEDNESDAY.THURSDAY.FRIDAY.SA ...

最新文章

  1. 博客园自定义页面风格设计 后续篇(页面设计模式及代码高亮 鼠标点击效果升级)...
  2. 磁悬浮地球仪控制初步测试
  3. unity------------------------------transform.forward与Vector.forward的区别
  4. 3D 相机halcon算子,持续更新
  5. ssm实训报告心得_Java开发学习心得(一):SSM环境搭建
  6. python生成1到100的列表_python列表生成式与列表生成器的使用
  7. 去除右键菜单中图形属性、图形选项
  8. 一般纳税人税额计算_一般纳税人企业缴税计算
  9. js 内置对象常用方法
  10. js根据出生年月获取年龄
  11. java同步数据,int类型清空为0
  12. 链游和元宇宙大热,互联网游戏从业者们如何看待它们? |链捕手
  13. Fabric CA 官方用户指南(中文版)
  14. 澳洲学计算机难毕业吗,澳洲新南威尔士大学计算机专业好吗
  15. Redis - CLUSTER命令中槽管理命令详解
  16. k8s 1.24 使用nfs,解决无法下载镜像问题
  17. freeSWITCH + WebRTC 音视频会议
  18. x64dbg 调试 EXCEPTION_ACCESS_VIOLATION C0000005
  19. 微信禁止访问国外服务器域名,域名被禁止访问?
  20. linux编译xlslib,[操作系统]linux 上使用libxls读和使用xlslib写excel的方法简介_星空网...

热门文章

  1. 项目经理,别让猴子跳回背上!
  2. 拓端tecdat|GARCH(1,1),MA以及历史模拟法的VaR比较
  3. Android-Intent界面跳转
  4. 铁岭市奔腾计算机学校地址,辽宁省铁岭市奔腾计算机职业高级中学2020年高三数学理上学期期末试题.docx...
  5. 3. 请列举java ee的主要新特性_JavaEE考试题
  6. python使用相对路径创建文件夹
  7. 史上最迷你人脸数据集olivettifaces基于卷积神经网络模型+迁移学习构建人脸识别模型实战
  8. X2Paddle实践之——Tensorflow版本VGG模型转化为paddle版本模型
  9. 燃情动作——《速度与激情:特别行动》影评数据分析可视化
  10. linux docker位置查找,linux – 如何在Docker中获取依赖子图像列表?