Skip to content

枚举的常用方法

概述

枚举继承自 java.lang.Enum,天然拥有一些实用方法。

常用方法一览

方法说明
values()获取所有枚举值(编译器生成)
valueOf(String)根据名称获取枚举值
ordinal()获取枚举值的序号(从 0 开始)
name()获取枚举值的名称字符串
compareTo(E)与另一个枚举值比较顺序
equals(Object)比较两个枚举值是否相等
hashCode()返回哈希码
toString()返回枚举值的字符串表示

代码示例

基本方法

java
public class EnumMethodsDemo {

    enum Season {
        SPRING, SUMMER, AUTUMN, WINTER
    }

    public static void main(String[] args) {
        // values() - 获取所有枚举值
        Season[] seasons = Season.values();
        for (Season s : seasons) {
            System.out.println(s);
        }

        // valueOf() - 根据名称获取
        Season spring = Season.valueOf("SPRING");
        System.out.println("Spring: " + spring);

        // ordinal() - 序号
        System.out.println("Spring ordinal: " + spring.ordinal());

        // name()
        System.out.println("Name: " + spring.name());
    }
}

自定义方法

java
public class EnumCustomMethodsDemo {

    enum Planet {
        MERCURY(0.39), VENUS(0.72), EARTH(1.0),
        MARS(1.52), JUPITER(5.2), SATURN(9.58);

        private final double distanceFromSun; // AU

        Planet(double distance) {
            this.distanceFromSun = distance;
        }

        // 自定义方法
        public double getDistance() {
            return distanceFromSun;
        }

        // 静态方法
        public static Planet getClosest(double distance) {
            for (Planet p : values()) {
                if (p.distanceFromSun >= distance) {
                    return p;
                }
            }
            return SATURN;
        }
    }

    public static void main(String[] args) {
        for (Planet p : Planet.values()) {
            System.out.printf("%s: %.2f AU%n", p, p.getDistance());
        }

        System.out.println("Closest to 1.3 AU: " + Planet.getClosest(1.3));
    }
}

与 String 转换

java
public class EnumStringDemo {

    enum Status {
        PENDING, APPROVED, REJECTED;

        // 从 String 转换(带容错)
        public static Status fromString(String value) {
            try {
                return Status.valueOf(value.toUpperCase());
            } catch (IllegalArgumentException e) {
                return PENDING;
            }
        }
    }

    public static void main(String[] args) {
        // valueOf 转换(严格)
        Status s1 = Status.valueOf("APPROVED");
        System.out.println(s1);

        // 自定义转换(容错)
        Status s2 = Status.fromString("rejected");
        System.out.println(s2);

        // toString
        System.out.println(s1.toString());
    }
}

compareTo

java
public class CompareToDemo {

    enum Size {
        SMALL, MEDIUM, LARGE
    }

    public static void main(String[] args) {
        int result = Size.LARGE.compareTo(Size.SMALL);
        System.out.println("LARGE vs SMALL: " + result);  // 2

        // 按定义顺序比较
        System.out.println(Size.MEDIUM.compareTo(Size.LARGE));  // -1
    }
}

注意事项

  1. values() 是编译器生成的,每个枚举类都有
  2. valueOf(String) 大小写敏感,名称不匹配抛 IllegalArgumentException
  3. ordinal() 从 0 开始,但不适合用于业务逻辑(添加枚举值会改变序号)
  4. 建议自定义 fromString() 方法,提供容错能力

基于 VitePress 构建