Java 枚举 (Enum)
                           
天天向上
发布: 2025-03-02 11:14:06

原创
973 人浏览过

Java 枚举(enum)是一种特殊的类,用于表示一组固定的常量。enum 在 Java 中是一个引用数据类型,可以用于表示一组预定义的常量,例如一周的七天、季节、状态码等。

Java 枚举是 java.lang.Enum 类的一个子类,具备了很多特殊功能,允许你定义有限个数的常量,并提供了强大的功能,如 switch 判断、遍历、与其他对象比较等。

1. 枚举的基本语法

枚举的声明使用 enum 关键字,枚举的每个常量通常以大写字母表示。

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

2. 使用枚举

一旦定义了枚举类型,就可以通过枚举常量来引用它们。

public class EnumExample {
    public static void main(String[] args) {
        Day today = Day.MONDAY;

        switch (today) {
            case MONDAY:
                System.out.println("Start of the workweek");
                break;
            case FRIDAY:
                System.out.println("Almost the weekend");
                break;
            case SUNDAY:
                System.out.println("Weekend is over");
                break;
            default:
                System.out.println("Midweek days");
        }
    }
}

输出:

Start of the workweek

3. 枚举的字段、构造方法和方法

枚举不仅仅是一些常量,它可以有字段、构造方法和方法。每个枚举常量都可以与数据和行为关联。

3.1 枚举的字段和构造方法

可以为枚举定义字段(例如,存储枚举常量相关的值)和构造方法。构造方法在枚举常量创建时会调用。

enum Day {
    MONDAY("Work day"), TUESDAY("Work day"), WEDNESDAY("Work day"),
    THURSDAY("Work day"), FRIDAY("Work day"), SATURDAY("Weekend"),
    SUNDAY("Weekend");

    private String type;

    // 构造方法
    Day(String type) {
        this.type = type;
    }

    // 方法
    public String getType() {
        return this.type;
    }
}

public class EnumExample {
    public static void main(String[] args) {
        Day today = Day.MONDAY;
        System.out.println(today + ": " + today.getType()); // 输出 "MONDAY: Work day"
    }
}

输出:

MONDAY: Work day

3.2 枚举的方法

你可以在枚举中定义方法来处理与常量相关的逻辑。比如:

enum Day {
    MONDAY("Work day", 1), TUESDAY("Work day", 2), WEDNESDAY("Work day", 3),
    THURSDAY("Work day", 4), FRIDAY("Work day", 5), SATURDAY("Weekend", 6),
    SUNDAY("Weekend", 7);

    private String type;
    private int dayNumber;

    Day(String type, int dayNumber) {
        this.type = type;
        this.dayNumber = dayNumber;
    }

    public String getType() {
        return this.type;
    }

    public int getDayNumber() {
        return this.dayNumber;
    }
}

public class EnumExample {
    public static void main(String[] args) {
        for (Day day : Day.values()) {
            System.out.println(day + ": " + day.getType() + ", Day number: " + day.getDayNumber());
        }
    }
}

输出:

MONDAY: Work day, Day number: 1
TUESDAY: Work day, Day number: 2
WEDNESDAY: Work day, Day number: 3
THURSDAY: Work day, Day number: 4
FRIDAY: Work day, Day number: 5
SATURDAY: Weekend, Day number: 6
SUNDAY: Weekend, Day number: 7

4. 枚举的内置方法

枚举类默认继承 java.lang.Enum 类,因此它有一些内置的方法。常用的内置方法包括:

4.1 values()

返回一个包含所有枚举常量的数组,按它们在枚举定义中的声明顺序返回。

public class EnumExample {
    public static void main(String[] args) {
        // 获取所有枚举常量
        Day[] days = Day.values();
        for (Day day : days) {
            System.out.println(day);
        }
    }
}

输出:

MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

4.2 valueOf(String name)

将一个字符串与枚举常量的名称进行匹配,并返回对应的枚举常量。

public class EnumExample {
    public static void main(String[] args) {
        Day day = Day.valueOf("MONDAY");
        System.out.println("The selected day is: " + day);
    }
}

输出:

The selected day is: MONDAY

如果传入的字符串不在枚举常量中,会抛出 IllegalArgumentException

4.3 ordinal()

返回枚举常量的序号(从 0 开始)。

public class EnumExample {
    public static void main(String[] args) {
        Day day = Day.MONDAY;
        System.out.println(day + " ordinal is: " + day.ordinal());
    }
}

输出:

MONDAY ordinal is: 0

4.4 compareTo()

ordinal() 类似,compareTo() 方法比较当前枚举常量和指定枚举常量的位置,返回一个整数值,表示它们在枚举中位置的相对顺序。

public class EnumExample {
    public static void main(String[] args) {
        Day day1 = Day.MONDAY;
        Day day2 = Day.FRIDAY;
        System.out.println(day1.compareTo(day2));  // 输出 -4,因为 MONDAY 在 FRIDAY 前
    }
}

5. 枚举的实际应用

5.1 枚举与 switch 语句

由于枚举值是常量,因此可以直接用于 switch 语句中,这样可以让代码更加清晰和安全。

public class EnumExample {
    public static void main(String[] args) {
        Day today = Day.WEDNESDAY;

        switch (today) {
            case MONDAY:
                System.out.println("Start of the work week");
                break;
            case FRIDAY:
                System.out.println("Almost the weekend");
                break;
            case SATURDAY:
            case SUNDAY:
                System.out.println("Weekend!");
                break;
            default:
                System.out.println("Midweek day");
        }
    }
}

5.2 枚举用于状态机模式

可以使用枚举来定义状态机的不同状态,并结合方法来改变状态的行为。

enum OrderStatus {
    NEW {
        @Override
        public void handle() {
            System.out.println("Order is new. Handle it.");
        }
    },
    SHIPPED {
        @Override
        public void handle() {
            System.out.println("Order is shipped. Handle shipping.");
        }
    },
    DELIVERED {
        @Override
        public void handle() {
            System.out.println("Order is delivered. Finalize the order.");
        }
    };

    public abstract void handle(); // 抽象方法
}

public class EnumExample {
    public static void main(String[] args) {
        OrderStatus status = OrderStatus.NEW;
        status.handle(); // 输出 "Order is new. Handle it."
    }
}

6. 总结

  • 定义枚举:通过 enum 关键字,定义一组有限的常量。
  • 枚举常量:可以包含字段、构造方法、方法和枚举常量。
  • 内置方法values(), valueOf(), ordinal(), compareTo() 等方法使得枚举更具功能。
  • 应用场景:常用于表示有限的状态集合、策略模式、事件处理、状态机等。

通过枚举,可以使代码更加清晰、类型安全,并有效避免硬编码。你可以将枚举应用到很多场景中,尤其是那些需要定义固定常量的地方。更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *