跳到主要内容

枚举

枚举在 Java 中是一种特殊的类,用于定义一组常量。通过枚举类,可以更清晰和安全地管理固定的常量集合。

枚举的基本特性

枚举类具有以下特点:

枚举可以视为一种常量类,提供了一组固定的常量实例。

枚举类的命名遵循大驼峰命名规则,每个单词的首字母大写。

枚举类不能继承其他类,因为它们已经隐式地继承了 java.lang.Enum

枚举实例在定义时自动创建,无法通过 new 关键字实例化。

枚举提供常量的名称和对应的下标(ordinal)值。

示例:定义和使用枚举

package com.enum_learning;

public enum UserType {
ADMIN, USER, GUEST
}
package com.enum_learning;

import java.util.Arrays;

public class Test {
public static void main(String[] args) {
UserType userType = UserType.GUEST;
UserType admin = UserType.ADMIN;

System.out.println(userType); // GUEST
System.out.println(userType.ordinal()); // 2
System.out.println(admin.name()); // ADMIN
System.out.println(UserType.valueOf("USER")); // USER
System.out.println(Arrays.toString(UserType.values())); // [ADMIN, USER, GUEST]
}
}

枚举类的特点

Java 的 enum 类型在底层实际上是一个特殊的类。当我定义一个 enum 时,它继承了 java.lang.Enum 这个抽象类,为枚举类型提供了基本的方法,如 name(), ordinal(), valueOf(), values() 等。

name() 方法返回枚举常量的名称,即代码中声明的精确名称。例如,对于 UserType.GUESTname() 方法返回 "GUEST"。

所有枚举类型都隐式地继承自 java.lang.Enum。由于 Java 不支持多继承,枚举类无法继承其他类。

枚举封装状态码

使用枚举封装状态码可以提高代码的可读性和维护性。下面是一个示例:

package com.enum_learning;

public enum DataInfo {
SUCCESS(0, "success"),
INVALID_USERNAME_LENGTH(1001, "invalid username length"),
INVALID_PASSWORD_LENGTH(1002, "invalid password length"),
USERNAME_NOT_EXIST(1003, "username not exist"),
WRONG_PASSWORD(1004, "wrong password");

private final int code;
private final String message;

DataInfo(int code, String message) {
this.code = code;
this.message = message;
}

public int getCode() {
return code;
}

public String getMessage() {
return message;
}
}
package com.enum_learning;

public class Test2 {
public static void main(String[] args) {
DataInfo dataInfo = DataInfo.SUCCESS;
System.out.println(dataInfo.getCode()); // 0
System.out.println(dataInfo.getMessage()); // success

DataInfo invalidUsername = DataInfo.INVALID_USERNAME_LENGTH;
System.out.println(invalidUsername.getCode()); // 1001
System.out.println(invalidUsername.getMessage()); // invalid username length
}
}

Java 的类加载机制与枚举特性

类的加载和初始化在枚举类中具有重要作用:

当首次访问枚举类的静态成员时,Java 会加载并初始化该类。这包括为静态变量分配空间并设置初始值。

枚举类在加载和初始化时,会创建所有枚举实例。这些实例作为静态成员被定义,因此在类初始化阶段被创建。例如,引用 DataInfo.SUCCESS 时,DataInfo 类会被加载和初始化,所有枚举实例(如 SUCCESS, INVALID_USERNAME_LENGTH 等)都会被创建,并执行其构造函数。

枚举类的构造函数在每个枚举实例创建时调用一次。对于 DataInfo 枚举类,其构造函数会被调用五次,对应内部定义的五个枚举实例。

注意事项

确保枚举类中的实例定义在枚举类的最前面,任何方法或字段都应在实例定义之后。 在处理复杂状态码或需要附加信息的场景中,使用枚举封装状态码是一种优雅且高效的解决方案。