目录
Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
本章节将对枚举进行详细阐述。

1、定义:枚举是一个特殊的类,一般表示一组常量,例如一年四季,一年的十二个月以及一周七天等。Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
2、示例:
(1)定义一个颜色的枚举类
- // 定义一个颜色的枚举类
- enum Color{
- Red, Green, Blue;
- }
(2)引用
- public static void main(String[] args){
- Color c = Color.Red;
- }
3、优点:将常量组织起来,统一进行管理
4、场景:错误码、状态机等
5、本质:java.lang.Enum的子类
enum定义的枚举类默认继承了java.lang.Enum类,并实现了java.lang.Serializable和java.lang.Comparable接口。
其种,以下方法位于java.lang.Enum类中,简单介绍以下方法的使用。
- values():返回枚举类中所有的值
- valueOf():返回指定字符串值的枚举常量
- name():返回实例名
- ordinal():查找枚举常量的索引
- equals():判断是否是同一对象,也可使用==比较
- getDeclaringClass():返回实例所属的enum类型
代码实例
- public class Day23 {
- // 定义一个颜色的枚举类
- enum Color{
- Red, Green, Blue;
- }
-
- // 定义一个一年四季的枚举类
- enum Season{
- Spring, Summer, Autumn, Winter;
- }
-
- public static void main(String[] args){
- Color r = Color.Red;
- Color g = Color.Green;
- Color b = Color.Blue;
-
- Season sp = Season.Spring;
- Season su = Season.Summer;
- Season au = Season.Autumn;
- Season wi = Season.Winter;
-
- /* 方法 */
- // values(): 返回枚举类中所有的值
- System.out.println("------values()------");
- for (Color color: Color.values()) {
- System.out.println(color);
- }
-
- // valueOf(): 返回指定字符串值的枚举常量
- System.out.println("------valueOf()------");
- System.out.println(Color.valueOf("Red"));
- System.out.println(Color.valueOf("Green"));
- System.out.println(Color.valueOf("Blue"));
-
- // name(): 返回实例名
- System.out.println("------name()------");
- System.out.println(r.name());
- System.out.println(g.name());
- System.out.println(b.name());
-
- // ordinal(): 查找枚举常量的索引
- System.out.println("------ordinal()------");
- System.out.println(r.ordinal());
- System.out.println(g.ordinal());
- System.out.println(b.ordinal());
-
- // equals(): 判断是否是同一对象,也可使用==比较
- System.out.println("------equals()------");
- System.out.println(r.equals(g)); // false
- System.out.println(r.equals(r)); // true
- System.out.println(r.equals(sp)); // false
-
- // getDeclaringClass(): 返回实例所属的enum类型
- System.out.println("------getDeclaringClass()------");
- System.out.println(r.getDeclaringClass());
- System.out.println(sp.getDeclaringClass());
- }
- }
结果
- ------values()------
- Red
- Green
- Blue
- ------valueOf()------
- Red
- Green
- Blue
- ------name()------
- Red
- Green
- Blue
- ------ordinal()------
- 0
- 1
- 2
- ------equals()------
- false
- true
- false
- ------getDeclaringClass()------
- class Java_learning.Day23$Color
- class Java_learning.Day23$Season
EnumSet是枚举类型的高性能Set实现,它要求放入它的枚举常量必须属于同一枚举类型。
- noneOf():创建空集合
- allOf():创建包含所有元素的结合
- of():创建包含指定元素的集合
- range():创建范围集合
- complementOf():补集
- copyOf():复制集合
代码实例
- // 创建空集合_EnumSet.noneOf(Month.class)
- EnumSet
enumSet1 = EnumSet.noneOf(Month.class); -
- // 创建包含所有元素的集合_EnumSet.allOf(Month.class)
- EnumSet
enumSet2 = EnumSet.allOf(Month.class); -
- // 创建包含指定元素的集合_EnumSet.of(Month.JANUARY, Month.DECEMBER)
- EnumSet
enumSet3 = EnumSet.of(Month.JANUARY, Month.DECEMBER); -
- // 创建范围集合_EnumSet.range(Month.JANUARY, Month.OCTOBER)
- // 第一个枚举值的索引位置必须大于第二个枚举值,不然会导致异常。
- EnumSet
enumSet4 = EnumSet.range(Month.JANUARY, Month.OCTOBER); -
- // 补集_EnumSet.complementOf(enumSet4)
- EnumSet
enumSet5 = EnumSet.complementOf(enumSet4); -
- // 复制集合
- EnumSet
enumSet6 = EnumSet.copyOf(enumSet5); -
- System.out.println("noneOf: " + enumSet1);
- System.out.println("allOf: " + enumSet2);
- System.out.println("of: " + enumSet3);
- System.out.println("range: " + enumSet4);
- System.out.println("complementOf: " + enumSet5);
- System.out.println("copyOf: " + enumSet6);
结果
- noneOf: []
- allOf: [JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER]
- of: [JANUARY, DECEMBER]
- range: [JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER]
- complementOf: [NOVEMBER, DECEMBER]
- copyOf: [NOVEMBER, DECEMBER]
EnumMap是专门为枚举类型定制的Map,EnumMap 在使用上跟HashMap差不多,但是EnumMap 的性能更好,所以,如果键为Enum 类型时,建议使用 EnumMap 代替 HashMap。
代码实例
- EnumMap
dayMap = new EnumMap<>(DayOfWeek.class); - for (DayOfWeek value: DayOfWeek.values()){
- dayMap.put(value, value.ordinal());
- }
-
- dayMap.forEach((k, v) -> System.out.println(k + " -> " + v));
结果
- MONDAY -> 0
- TUESDAY -> 1
- WEDNESDAY -> 2
- THURSDAY -> 3
- FRIDAY -> 4
- SATURDAY -> 5
- SUNDAY -> 6
创建四个方向的枚举常量:
- enum Direction{
- up, down, left, right;
- }
在 switch 中使用枚举类
- // 常量
- enum Direction{
- up, down, left, right;
- }
-
- // switch
- static class Reverse{
- Direction d = Direction.right;
-
- public void change(){
- switch (d){
- case up:
- d = Direction.down;
- break;
- case down:
- d = Direction.up;
- break;
- case left:
- d = Direction.right;
- break;
- case right:
- d = Direction.left;
- break;
- }
- }
- }
- enum Signal{
- RED("红色", 1), GREEN("绿色", 2), YELLOW("黄色", 3);
-
- // 成员变量
- private String name;
- private int index;
-
- // 构造方法
- Signal(String name, int index) {
- this.name = name;
- this.index = index;
- }
-
- // 普通方法
- public String getName(int index){
- for (Signal s: Signal.values()){
- if (s.getIndex() == index){
- return s.name;
- }
- }
- return null;
- }
-
- // get set 方法
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getIndex() {
- return index;
- }
- public void setIndex(int index) {
- this.index = index;
- }
- }
- enum Family{
- Father("父亲", 1), Mother("母亲", 1), Brother("兄弟", 1), Sister("姐妹", 1);
- private String name;
- private int index;
-
- Family(String name, int index) {
- this.name = name;
- this.index = index;
- }
-
- // 覆盖方法
- public String toString(){
- return this.index+"_"+this.name;
- }
- }
- interface Move{
- void move_up();
- void move_down();
- void move_left();
- void move_right();
- }
-
- enum interfaceMove implements Move{
- up("上", 1), down("下", 2), left("左", 3), right("右", 4);
-
- private String dir;
- private int index;
-
- interfaceMove(String dir, int index) {
- this.dir = dir;
- this.index = index;
- }
-
- @Override
- public void move_up() {
-
- }
-
- @Override
- public void move_down() {
-
- }
-
- @Override
- public void move_left() {
-
- }
-
- @Override
- public void move_right() {
-
- }
- }
- interface Animal{
- enum Dog implements Animal{
- dog1, dog2, dog3;
- }
-
- enum Cat implements Animal{
- cat1, cat2, cat3;
- }
- }
- import org.threeten.bp.DayOfWeek;
- import org.threeten.bp.Month;
-
- import java.util.EnumMap;
- import java.util.EnumSet;
-
- public class Day23 {
- // 定义一个颜色的枚举类
- enum Color{
- Red, Green, Blue;
- }
-
- // 定义一个一年四季的枚举类
- enum Season{
- Spring, Summer, Autumn, Winter;
- }
-
- /* 常见用法 */
- // 常量
- enum Direction{
- up, down, left, right;
- }
-
- // switch
- static class Reverse{
- Direction d = Direction.right;
-
- public void change(){
- switch (d){
- case up:
- d = Direction.down;
- break;
- case down:
- d = Direction.up;
- break;
- case left:
- d = Direction.right;
- break;
- case right:
- d = Direction.left;
- break;
- }
- }
- }
-
- // 向枚举中添加新方法
- enum Signal{
- RED("红色", 1), GREEN("绿色", 2), YELLOW("黄色", 3);
-
- // 成员变量
- private String name;
- private int index;
-
- // 构造方法
- Signal(String name, int index) {
- this.name = name;
- this.index = index;
- }
-
- // 普通方法
- public String getName(int index){
- for (Signal s: Signal.values()){
- if (s.getIndex() == index){
- return s.name;
- }
- }
- return null;
- }
-
- // get set 方法
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getIndex() {
- return index;
- }
- public void setIndex(int index) {
- this.index = index;
- }
- }
-
- // 覆盖枚举的方法
- enum Family{
- Father("父亲", 1), Mother("母亲", 1), Brother("兄弟", 1), Sister("姐妹", 1);
- private String name;
- private int index;
-
- Family(String name, int index) {
- this.name = name;
- this.index = index;
- }
-
- // 覆盖方法
- public String toString(){
- return this.index+"_"+this.name;
- }
- }
-
- // 实现接口
- interface Move{
- void move_up();
- void move_down();
- void move_left();
- void move_right();
- }
-
- enum interfaceMove implements Move{
- up("上", 1), down("下", 2), left("左", 3), right("右", 4);
-
- private String dir;
- private int index;
-
- interfaceMove(String dir, int index) {
- this.dir = dir;
- this.index = index;
- }
-
- @Override
- public void move_up() {
-
- }
-
- @Override
- public void move_down() {
-
- }
-
- @Override
- public void move_left() {
-
- }
-
- @Override
- public void move_right() {
-
- }
- }
-
- // 使用接口组织枚举
- interface Animal{
- enum Dog implements Animal{
- dog1, dog2, dog3;
- }
-
- enum Cat implements Animal{
- cat1, cat2, cat3;
- }
- }
-
- public static void main(String[] args){
- Color r = Color.Red;
- Color g = Color.Green;
- Color b = Color.Blue;
-
- Season sp = Season.Spring;
- Season su = Season.Summer;
- Season au = Season.Autumn;
- Season wi = Season.Winter;
-
- /* 方法 */
- // values(): 返回枚举类中所有的值
- System.out.println("------values()------");
- for (Color color: Color.values()) {
- System.out.println(color);
- }
-
- // valueOf(): 返回指定字符串值的枚举常量
- System.out.println("------valueOf()------");
- System.out.println(Color.valueOf("Red"));
- System.out.println(Color.valueOf("Green"));
- System.out.println(Color.valueOf("Blue"));
-
- // name(): 返回实例名
- System.out.println("------name()------");
- System.out.println(r.name());
- System.out.println(g.name());
- System.out.println(b.name());
-
- // ordinal(): 查找枚举常量的索引
- System.out.println("------ordinal()------");
- System.out.println(r.ordinal());
- System.out.println(g.ordinal());
- System.out.println(b.ordinal());
-
- // equals(): 判断是否是同一对象,也可使用==比较
- System.out.println("------equals()------");
- System.out.println(r.equals(g)); // false
- System.out.println(r.equals(r)); // true
- System.out.println(r.equals(sp)); // false
-
- // getDeclaringClass(): 返回实例所属的enum类型
- System.out.println("------getDeclaringClass()------");
- System.out.println(r.getDeclaringClass());
- System.out.println(sp.getDeclaringClass());
-
- /* 工具类——EnumSet */
- // 创建空集合_EnumSet.noneOf(Month.class)
- EnumSet
enumSet1 = EnumSet.noneOf(Month.class); -
- // 创建包含所有元素的集合_EnumSet.allOf(Month.class)
- EnumSet
enumSet2 = EnumSet.allOf(Month.class); -
- // 创建包含指定元素的集合_EnumSet.of(Month.JANUARY, Month.DECEMBER)
- EnumSet
enumSet3 = EnumSet.of(Month.JANUARY, Month.DECEMBER); -
- // 创建范围集合_EnumSet.range(Month.JANUARY, Month.OCTOBER)
- // 第一个枚举值的索引位置必须大于第二个枚举值,不然会导致异常。
- EnumSet
enumSet4 = EnumSet.range(Month.JANUARY, Month.OCTOBER); -
- // 补集_EnumSet.complementOf(enumSet4)
- EnumSet
enumSet5 = EnumSet.complementOf(enumSet4); -
- // 复制集合
- EnumSet
enumSet6 = EnumSet.copyOf(enumSet5); -
- System.out.println("noneOf: " + enumSet1);
- System.out.println("allOf: " + enumSet2);
- System.out.println("of: " + enumSet3);
- System.out.println("range: " + enumSet4);
- System.out.println("complementOf: " + enumSet5);
- System.out.println("copyOf: " + enumSet6);
-
- /* 工具类——EnumMap */
- System.out.println("------EnumMap------" + enumSet6);
-
- EnumMap
dayMap = new EnumMap<>(DayOfWeek.class); - for (DayOfWeek value: DayOfWeek.values()){
- dayMap.put(value, value.ordinal());
- }
-
- dayMap.forEach((k, v) -> System.out.println(k + " -> " + v));
- }
- }