Java 基础教程

枚举类(Enum)

在 Java 中,枚举(enum)类型相当于特殊的类,经过编译之后同样会产生一个 class 字节码文件。枚举类型中可以定义构造方法、方法、属性、静态方法和静态属性、继承接口、重载覆盖等等,类似于普通的类。

Java 枚举类型本质上是一种继承了 java.lang.Enum 类的类,它是引用数据类型,因此也称为 “枚举类”。

Java 中是使用 enum 关键词声明枚举类,枚举的具体定义放在一对大括号内,枚举的语法格式如下:

public enum EnumName {
   CONSTANT1,
   CONSTANT2;
   //...
}

其中,EnumName 是枚举类的名称,CONSTANT1、CONSTANT2 等是枚举类的常量。每个常量都以逗号分隔,并且通常使用大写字母命名。例如:

/**
* 性别枚举
* @author hxstrive.com
*/
public enum SexEnum {
   /** 男 */
   MALE,
   /** 女 */
   FEMALE,
   /** 其他 */
   OTHER;
}

此时,我们就可以通过 SexEnum.MALE 的方式使用。

枚举类的构造函数

枚举类的构造函数默认是私有的,只能在枚举类内部使用。如果需要在枚举类外部访问构造函数,可以显式地声明为 public。例如:

/**
* 性别枚举
* @author hxstrive.com
*/
public enum SexEnum {
   MALE("male", "男"),
   FEMALE("female", "女"),
   OTHER("other", "其他");

   private String code;
   private String name;
   
   // 定义构造方法,接收两个字符串
   private SexEnum(String code, String name) {
       this.code = code;
       this.name = name;
   }

}

枚举类的方法

枚举类可以包含普通方法,用于执行特定的操作。例如:

/**
* 性别枚举
* @author hxstrive.com
*/
public enum SexEnum {
   MALE("male", "男"),
   FEMALE("female", "女"),
   OTHER("other", "其他");

   private String code;
   private String name;
   private SexEnum(String code, String name) {
       this.code = code;
       this.name = name;
   }

   // 定义普通方法,获取枚举实例的 code 值
   public String getCode() {
       return code;
   }

   // 定义普通方法,获取枚举实例的 name 值
   public String getName() {
       return name;
   }
}

枚举类的字段

枚举类可以包含字段,用于存储与枚举常量相关的数据。例如:

/**
* 性别枚举
* @author hxstrive.com
*/
public enum SexEnum {
   MALE("male", "男"),
   FEMALE("female", "女"),
   OTHER("other", "其他");

   // 字段:存放枚举项的CODE
   private String code;
   // 字段:存放枚举项名称
   private String name;
   
   private SexEnum(String code, String name) {
       this.code = code;
       this.name = name;
   }

}

枚举类应用

valueOf() 方法

使用枚举类时,可以通过枚举常量的名称访问它们,例如 SexEnum.MALE。也可以使用 Enum.valueOf() 方法将字符串转换为对应的枚举常量,例如:

public class Demo {

   private enum SexEnum {
       MALE("male", "男"),
       FEMALE("female", "女"),
       OTHER("other", "其他");

       private String code;
       private String name;
       private SexEnum(String code, String name) {
           this.code = code;
           this.name = name;
       }

       public String getCode() {
           return code;
       }

       public String getName() {
           return name;
       }
   }

   public static void main(String[] args) {
       // 将字符串 “MALE” 转换成 SexEnum 枚举对象
       SexEnum sexEnum = SexEnum.valueOf("MALE");
       System.out.println("code=" + sexEnum.getCode());
       System.out.println("name=" + sexEnum.getName());
   }
}

运行示例,输出如下:

code=male
name=男

枚举比较 “==”

枚举类的常量是唯一的,可以使用 “==” 运算符进行比较。例如:

public class Demo {

   private enum SexEnum {
       MALE("male", "男"),
       FEMALE("female", "女"),
       OTHER("other", "其他");

       private String code;
       private String name;
       private SexEnum(String code, String name) {
           this.code = code;
           this.name = name;
       }

       public String getCode() {
           return code;
       }

       public String getName() {
           return name;
       }
   }

   public static void main(String[] args) {
       if(args.length == 0) {
           System.exit(-1);
       }

       SexEnum sexEnum = SexEnum.valueOf(args[0]);
       // 如果输入的性别是 SexEnum.MALE,则在控制台输出信息
       if(sexEnum == SexEnum.MALE) {
           System.out.println("你输入了 “男” 性别");
       }
   }
}

运行示例,输出如下:

$ java Demo MALE
你输入了 “男” 性别

迭代枚举 values()

可以使用 values() 方法获取枚举类的所有常量,以数组的形式返回。例如:

public class Demo {

   private enum SexEnum {
       MALE("male", "男"),
       FEMALE("female", "女"),
       OTHER("other", "其他");

       private String code;
       private String name;
       private SexEnum(String code, String name) {
           this.code = code;
           this.name = name;
       }

       public String getCode() {
           return code;
       }

       public String getName() {
           return name;
       }
   }

   public static void main(String[] args) {
       // 迭代枚举类的常量
       SexEnum[] sexEnums = SexEnum.values();
       for(SexEnum sexEnum : sexEnums) {
           System.out.println("code=" + sexEnum.getCode() + "  name=" + sexEnum.getName());
       }
   }
}

运行示例,输出如下:

code=male  name=男
code=female  name=女
code=other  name=其他

枚举底层原理

实际上在使用关键字 enum 创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了 Java API 中的 java.lang.Enum 类。

以上面案例为例,使用 javac 编译 SexEnum.java 文件,将生成 SexEnum.class 字节码文件。SexEnum 类是 final 类型的,将无法被继承,并且 SexEnum 类继承自java.lang.Enum 类。

对于 java.lang.Enum 类,Java API 描述如下:

This is the common base class of all Java language enumeration types. More information about enums, including descriptions of the implicitly declared methods synthesized by the compiler, can be found in section 8.9 of The Java™ Language Specification.

这是所有 Java 语言枚举类型的公共基类。有关枚举的更多信息,包括编译器合成的隐式声明方法的描述,可以在 Java™ 语言规范的第 8.9 节中找到。

Note that when using an enumeration type as the type of a set or as the type of the keys in a map, specialized and efficient set and map implementations are available.

请注意,当使用枚举类型作为集合的类型或作为 Map 中键的类型时,可以使用专门和高效的集合和 Map 实现。

由于 Java 单继承的原因,enum 类并不能再继承其它类,但这并不妨碍它实现接口,因此 enum 类同样是可以实现多接口的。例如:

package com.hxstrive.demo;

public class Demo {

   // 定义一个接口
   interface Find {
       SexEnum find(String code);
   }

   // 定义枚举类
   enum SexEnum implements Find {
       MALE("male", "男"),
       FEMALE("female", "女"),
       OTHER("other", "其他");

       private String code;
       private String name;
       private SexEnum(String code, String name) {
           this.code = code;
           this.name = name;
       }

       public String getCode() {
           return code;
       }

       public String getName() {
           return name;
       }

       // 实现接口方法
       @Override
       public SexEnum find(String code) {
           if(null == code || code.trim().length() == 0) {
               return null;
           }

           for(SexEnum sexEnum : values()) {
               if(sexEnum.code.equals(code)) {
                   return sexEnum;
               }
           }

           return null;
       }
   }

   public static void main(String[] args) {
       // 迭代枚举类的常量
       SexEnum sexEnum = SexEnum.MALE.find("female");
       System.out.println("code=" + sexEnum.getCode() + "  name=" + sexEnum.getName());
   }
}

运行示例,输出如下:

code=female  name=女
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号