您的位置:

Java中的枚举(enum)用法

枚举(enum)是Java中一种比较特殊的数据类型,它专门用于定义常量(如某些状态、类型、级别等)的集合。枚举类型始于Java 1.5版本,其中新增加了enum关键字,可以定义一个枚举类型。在Java中,枚举类型可以像类一样拥有自己的属性和方法。本文将从以下几个方面对Java中的枚举(enum)用法进行详细阐述。

一、枚举定义与初始化

在Java语言中,通过使用关键字enum来定义枚举。

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

上述代码定义了一个Season的枚举类型,其中包含了四个常量(SPRING、SUMMER、AUTUMN、WINTER),它们都是Season类型的实例。枚举类型定义的格式为:enum 枚举类型名称 { 常量1,常量2,……常量n }

枚举在使用时可以直接通过枚举常量来进行初始化,例如:

public class EnumTest{
    Season season;
    
    public EnumTest(Season season){
        this.season = season;
    }
    
    public void describe(){
        switch(season){
            case SPRING:
                System.out.println("现在是春天!");
                break;
            case SUMMER:
                System.out.println("现在是夏天!");
                break;
            case AUTUMN:
                System.out.println("现在是秋天!");
                break;
            case WINTER:
                System.out.println("现在是冬天!");
                break;
            default:
                System.out.println("不知道现在是什么季节!");
                break;
        }
    }
    
    public static void main(String[] args){
        EnumTest test1 = new EnumTest(Season.SPRING);
        EnumTest test2 = new EnumTest(Season.SUMMER);
        EnumTest test3 = new EnumTest(Season.AUTUMN);
        EnumTest test4 = new EnumTest(Season.WINTER);
        test1.describe();
        test2.describe();
        test3.describe();
        test4.describe();
    }
}

上述代码中,我们定义了一个名为Season的枚举类型,然后在EnumTest类中定义了一个用于描述季节的方法,这个方法的参数是一个Season类型的枚举常量。最后在main方法中我们通过分别传递不同的Season常量来对其进行测试,并打印出当前季节的描述。

二、使用枚举常量

在Java中,枚举常量也是枚举类型的实例。由于枚举常量可以看作是一种特殊的实例,因此可以像普通实例一样访问它们的成员变量和方法。

枚举常量还可以有自己的值,可以像下面这样对枚举常量进行赋值:

enum WeekDay{
    MONDAY("星期一"),TUESDAY("星期二"),WEDNESDAY("星期三"),
    THURSDAY("星期四"),FRIDAY("星期五"),SATURDAY("星期六"),SUNDAY("星期日");
    private String chineseName;
    WeekDay(String name){
        chineseName = name;
    }
    public String getChineseName(){
        return chineseName;
    }
}

上述代码中定义了一个WeekDay枚举类型,每个枚举常量(MONDAY、TUESDAY、……SUNDAY)都有一个中文名称。每个枚举常量都可以通过getChineseName()方法来获取它的中文名称。

三、枚举和接口的使用

Java中的枚举类型可以实现接口,这让枚举在某些场景下变得更加灵活。例如:

interface Operation{
    double apply(double x, double y);
}
enum BasicOperation implements Operation{
    PLUS("+") {
        public double apply(double x, double y) { return x + y; }
    },
    MINUS("-") {
        public double apply(double x, double y) { return x - y; }
    },
    TIMES("*") {
        public double apply(double x, double y) { return x * y; }
    },
    DIVIDE("/") {
        public double apply(double x, double y) { return x / y; }
    };
    private final String symbol;
    BasicOperation(String symbol) { this.symbol = symbol; }
    @Override public String toString() { return symbol; }
}
public class UseEnum{
    public static void main(String[] args){
        double x = 10.0, y = 5.0;
        for(BasicOperation op : BasicOperation.values()){
            System.out.printf("%f %s %f = %f%n", x, op, y, op.apply(x, y));
        }
    }
}

上述代码中,我们定义了一个Operation接口,这个接口包含了一个apply()方法,用于计算两个double类型参数的值。然后我们定义了一个BasicOperation枚举类型,其中每个枚举常量实现了Operation接口的apply()方法。最后在UseEnum类中,我们通过枚举的values()方法来遍历BasicOperation枚举类型中的所有枚举常量,分别对它们执行apply()方法,并输出运算结果。

四、枚举和泛型的使用

Java中的枚举类型也可以用于泛型类或泛型方法的定义中。例如:

public class EnumMapTest{
    public static void main(String[] args){
        EnumMap map = new EnumMap<>(WeekDay.class);
        map.put(WeekDay.MONDAY, "星期一");
        map.put(WeekDay.TUESDAY, "星期二");
        map.put(WeekDay.WEDNESDAY, "星期三");
        map.put(WeekDay.THURSDAY, "星期四");
        map.put(WeekDay.FRIDAY, "星期五");
        map.put(WeekDay.SATURDAY, "星期六");
        map.put(WeekDay.SUNDAY, "星期日");
        System.out.println(map);
    }
}

  

上述代码中,我们定义了一个EnumMap类型的对象,并指定它的键值类型是WeekDay和String。接着我们向这个EnumMap对象中放入了7个键值对,最后用println()方法输出这个EnumMap对象。由于EnumMap的实现内部使用数组来存储键值对,因此EnumMap对键的判等比HashMap要快。

五、枚举对比和序列化

Java中的Enumeration接口虽然与枚举相关,但是它并不支持添加或删除元素等操作。而枚举类型则可以支持这些操作,因此在Java中建议使用枚举类型来代替Enumeration接口。

Java中的枚举类型默认是实现Serializable接口的,并且它们的序列化和反序列化都是在JVM中自动进行的。所以我们不用考虑用于序列化和反序列化的IO操作,这就大大节省了我们的时间和精力。

六、小结

本文对Java中枚举类型的定义、初始化、使用方法、接口和泛型等多个方面进行了详细的阐述,并给出了相应的代码示例。枚举类型在Java中是一种比较特殊的数据类型,需要熟练掌握这些使用方法才能更好地利用它们来完成编程任务。