您的位置:

Java枚举详解

一、枚举定义

Java中的枚举是一种特殊的数据类型,用于定义一个有限的、预定义的常量集合。可用于switch语句、集合、Map和线程安全等需求。

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}

上述代码定义了一个四季枚举类型,包含了四个常量,分别表示春、夏、秋、冬。常量的名称也可以不全部大写,但通常建议全部大写。

二、枚举常量方法

枚举常量是类的静态常量,因此可以有自己的构造函数、实例变量和方法。

public enum Season {
    SPRING("春", "温暖"), SUMMER("夏", "炎热"), AUTUMN("秋", "凉爽"), WINTER("冬", "寒冷");

    private final String name;
    private final String desc;

    Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }
}

上述代码中枚举常量定义了两个实例变量name和desc,并定义了一个构造函数,通过枚举常量的名称和描述分别进行初始化。同时,定义了getName()和getDesc()方法,用来获取常量的名称和描述。

三、枚举方法

除了常量方法以外,枚举类型还可以定义自己的实例方法,供外部调用。

public enum Season {
    SPRING("春", "温暖"), SUMMER("夏", "炎热"), AUTUMN("秋", "凉爽"), WINTER("冬", "寒冷");

    private final String name;
    private final String desc;

    Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }

    public boolean isSnow() {
        return this == WINTER;
    }
}

上述代码中定义了一个isSnow()方法,用来判断当前枚举是否是冬季,如果是则返回true,否则返回false。

四、switch语句与枚举

使用枚举常量进行switch判断可以是代码更加清晰,避免了使用字符串或整型时出现拼写错误和类型错误的问题。

public enum Week {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public static void printToday(Week day) {
    switch (day) {
        case MONDAY:
            System.out.println("今天是星期一");
            break;
        case TUESDAY:
            System.out.println("今天是星期二");
            break;
        case WEDNESDAY:
            System.out.println("今天是星期三");
            break;
        case THURSDAY:
            System.out.println("今天是星期四");
            break;
        case FRIDAY:
            System.out.println("今天是星期五");
            break;
        case SATURDAY:
            System.out.println("今天是星期六");
            break;
        case SUNDAY:
            System.out.println("今天是星期日");
            break;
    }
}

上述代码通过Week枚举类型进行判断,输出今天是星期几。

五、枚举集合与Map

枚举也可以用于集合和Map等数据结构。如下面的代码所示:

public enum Color {
    RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF);

    private final int value;

    Color(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    private static final Map cacheMap = new ConcurrentHashMap<>();

    static {
        for (Color c : Color.values()) {
            cacheMap.put(c.getValue(), c);
        }
    }

    public static Color colorOf(int value) {
        return cacheMap.get(value);
    }
}

  

上述代码定义了一个Color枚举类型,包含了三个常量RED、GREEN和BLUE,分别对应了红、绿、蓝三个颜色。同时,定义了一个实例变量value、一个构造函数、一个获取value的方法和一个静态方法colorOf,用来获取颜色值所对应的颜色对象。

colorOf方法使用了ConcurrentHashMap缓存了所有的Color常量对象,在获取颜色值时直接从Map中获取对应的颜色常量对象。

六、线程安全

枚举类型本身是线程安全的,因此在多线程环境下使用枚举类型可以避免多线程访问和修改同一共享变量产生的线程安全问题。例如:

public enum Singleton {
    INSTANCE;

    public void doSomething() {
        // ...
    }
}

上述代码定义了一个Singleton枚举类型,表示单例模式中的唯一实例。由于枚举类型只会被实例化一次,因此这种枚举实现的单例模式是线程安全的。