📌 目录

  1. 什么是枚举?
  2. 枚举的声明与定义
  3. 枚举的特性
  4. 枚举常用方法
  5. 枚举的应用场景
  6. 枚举与 switch 语句
  7. 枚举的示例代码
  8. 枚举的高级用法
  9. 参考资料
  10. 出站链接

1. 什么是枚举?

枚举(enum) 是 Java 中的一种特殊类型,用于表示一组固定的常量。它可以代替常规的 int 常量,提高代码的可读性和可维护性。枚举类型是类的一种,定义了固定的实例,并可以提供一些额外的功能。通常用于表示一组相关的常量,如星期几、月份、方向等。


2. 枚举的声明与定义

在 Java 中,枚举类型使用 enum 关键字声明。枚举类型可以定义在类外部,也可以定义在类内部。每个枚举实例相当于一个常量,枚举成员由 , 分隔。

基本语法:

enum EnumName {
    CONSTANT1, CONSTANT2, CONSTANT3;
}

示例:定义枚举类型 Day

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}


3. 枚举的特性

  1. 类型安全:枚举类型是强类型的,只能使用定义的常量,不允许其他值。
  2. 默认方法:枚举类型继承自 java.lang.Enum 类,默认拥有一些方法。
  3. 构造器:枚举类可以有构造方法,但构造方法只能是 private 的。
  4. 成员变量和方法:枚举类型可以有成员变量和方法,每个枚举常量是一个对象,可以包含不同的属性和行为。
  5. 枚举常量是单例:枚举类的每个常量只能实例化一次,因此具有单例特性。

4. 枚举常用方法

枚举类型继承了 Enum 类,因此可以使用 Enum 类中的一些常用方法:

  • values():返回所有枚举常量的数组。
  • valueOf(String name):根据指定的名字返回对应的枚举常量。
  • ordinal():返回枚举常量的索引值(从 0 开始)。
  • name():返回枚举常量的名字。

示例:

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

    // 返回枚举常量的索引
    public int getDayIndex() {
        return this.ordinal();
    }
}

public class TestEnum {
    public static void main(String[] args) {
        // 使用 values() 方法
        Day[] days = Day.values();
        for (Day day : days) {
            System.out.println(day);
        }

        // 使用 valueOf() 方法
        Day friday = Day.valueOf("FRIDAY");
        System.out.println("Friday's index: " + friday.getDayIndex());
    }
}

输出

MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY
Friday's index: 4


5. 枚举的应用场景

  1. 定义固定的常量集:如星期几、月份、季节、方向等。
  2. 代替 int 常量:可以用枚举来代替 int 常量的定义,使代码更具可读性和类型安全。
  3. 状态表示:例如订单状态、任务状态等,可以通过枚举类型清晰地表示状态。
  4. 策略模式:使用枚举类型来表示不同的策略或行为,通过枚举的实例来控制不同的处理逻辑。

6. 枚举与 switch 语句

枚举类型与 switch 语句结合使用时,可以根据枚举的不同常量执行不同的代码逻辑。

示例:

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

public class SwitchEnumExample {
    public static void main(String[] args) {
        Day day = Day.MONDAY;
        switch (day) {
            case MONDAY:
                System.out.println("Start of the week!");
                break;
            case FRIDAY:
                System.out.println("End of the week!");
                break;
            case SATURDAY:
            case SUNDAY:
                System.out.println("Weekend!");
                break;
            default:
                System.out.println("Midweek day.");
                break;
        }
    }
}

输出

Start of the week!


7. 枚举的示例代码

示例 1:枚举与属性

enum Season {
    SPRING("Spring", 20), SUMMER("Summer", 30), FALL("Fall", 15), WINTER("Winter", 0);

    private final String name;
    private final int averageTemperature;

    // 构造方法
    Season(String name, int averageTemperature) {
        this.name = name;
        this.averageTemperature = averageTemperature;
    }

    public String getName() {
        return name;
    }

    public int getAverageTemperature() {
        return averageTemperature;
    }
}

public class TestSeason {
    public static void main(String[] args) {
        for (Season season : Season.values()) {
            System.out.println(season.getName() + ": " + season.getAverageTemperature() + "°C");
        }
    }
}

输出

Spring: 20°C
Summer: 30°C
Fall: 15°C
Winter: 0°C

示例 2:枚举与方法

enum Direction {
    NORTH, EAST, SOUTH, WEST;

    // 枚举类可以包含方法
    public void printDirection() {
        switch (this) {
            case NORTH:
                System.out.println("Heading North");
                break;
            case EAST:
                System.out.println("Heading East");
                break;
            case SOUTH:
                System.out.println("Heading South");
                break;
            case WEST:
                System.out.println("Heading West");
                break;
        }
    }
}

public class TestDirection {
    public static void main(String[] args) {
        Direction direction = Direction.NORTH;
        direction.printDirection();  // 输出:Heading North
    }
}

输出

Heading North


8. 枚举的高级用法

  1. 实现接口:枚举可以实现接口,从而增加一些行为。
  2. 自定义构造方法:枚举类型可以有自定义构造方法,用来为每个枚举常量指定不同的属性值。
  3. 覆写方法:枚举类型可以覆写 toString() 方法,提供自定义的输出。

示例:实现接口

interface Movable {
    void move();
}

enum Vehicle implements Movable {
    CAR, BIKE, PLANE;

    @Override
    public void move() {
        switch (this) {
            case CAR:
                System.out.println("Car is moving");
                break;
            case BIKE:
                System.out.println("Bike is moving");
                break;
            case PLANE:
                System.out.println("Plane is flying");
                break;
        }
    }
}

public class TestEnumWithInterface {
    public static void main(String[] args) {
        Vehicle car = Vehicle.CAR;
        car.move();  // 输出:Car is moving
    }
}


9. 参考资料


10. 出站链接