一、什么是Java Enum类
Java Enum类是从Java 5开始引入的类型,它是一种特殊类型的类,它可以用来定义一组常量,这些常量通常表示一些有限的可能性。Enum类可以被看作是一组有限常量的组合,同时它也可以具有属性和方法,这些属性和方法是与枚举的常量相关联的。
Enum类是final类,所以它不能被继承。同时Enum类的构造方法是私有的,因此枚举常量的实例化不能在程序中自行完成,而是由编译器完成实例化。
二、Java Enum类的优缺点
Enum类具有以下优点:
1、易读性好:枚举类型常量名称是有意义的,而且可以据此获知它是整个类型中的哪一个。
2、类型安全:由于枚举值是在编译器进行检查的,所以不存在误解,也可以防止在传递参数时传递非法的枚举值。
3、可读性好:我们可以使用枚举类型的toString()方法获取具有可读性的名称。
4、可以使用switch语句:我们可以使用switch语句轻松处理枚举类型。
Enum类具有以下缺点:
1、不能继承:对于一些含有许多共同特征的常量,可能会导致代码重复,但是由于Enum类不能被继承,所以不得不重复定义。
2、不能在运行时动态获得枚举值:由于枚举值是在编译器进行检查的,所以不能通过简单的字符串转换获得枚举值,如果需要这样做,需要手动编写代码进行转换。
三、Java Enum类的定义和使用
1、定义枚举类型
public enum Season { SPRING, SUMMER, AUTUMN, WINTER; }
在定义枚举类型时,除了类名和枚举常量之外,不需要添加其他元素。
上面的例子中定义了一个代表四季的枚举类型Season,其中SPRING、SUMMER、AUTUMN和WINTER是四个枚举常量,它们分别代表春、夏、秋、冬。
2、使用枚举类型
Season season = Season.SUMMER;
我们可以通过枚举类型名称和枚举常量名称来获得枚举类型的实例,这里的变量season就是Season类型的实例化对象。
3、枚举类型的属性和方法
除了可以使用枚举类型的名称和枚举常量名称来获得枚举类型的实例之外,我们还可以使用枚举类型的属性和方法来获取相关信息。
3.1、获取枚举类型的属性
public enum Season { SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天"); private String name; Season(String name) { this.name = name; } public String getName() { return name; } }
在上面的代码中,我们为每个枚举常量增加了一个name属性,并在构造方法中为其赋值,同时增加了一个getName()方法,用来获得该属性的值。
Season season = Season.SUMMER; System.out.println(season.getName());
在使用时,我们可以通过调用枚举类型的属性来获取相关信息,如上面的例子中,我们使用了getName()方法来获得枚举常量的名字。
3.2、枚举类型的方法
public enum Season { SPRING("春天", 1), SUMMER("夏天", 2), AUTUMN("秋天", 3), WINTER("冬天", 4); private String name; private int index; Season(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } public static Season getSeasonById(int index) { Season[] seasons = Season.values(); for(Season season : seasons) { if(season.getIndex() == index) { return season; } } return null; } }
在上面的代码中,我们增加了一个index属性,并在构造方法中为其赋值,同时增加了一个getIndex()方法来获得该属性的值。另外,我们还增加了一个静态方法getSeasonById(),用来根据index获得对应的Season类型。
Season season = Season.getSeasonById(2); System.out.println(season.getName());
在使用时,我们可以通过调用枚举类型的方法来获取相关信息,如上面的例子中,我们使用了getSeasonById()方法来根据指定index获得对应的枚举类型。
四、Java Enum类的高级用法
1、枚举类型的实现接口
public interface Action { void doSomething(); } public enum Season implements Action { SPRING("春天", 1) { @Override public void doSomething() { System.out.println("春天来了,万物复苏"); } }, SUMMER("夏天", 2) { @Override public void doSomething() { System.out.println("夏天来了,热情奔放"); } }, AUTUMN("秋天", 3) { @Override public void doSomething() { System.out.println("秋天来了,金风玉露"); } }, WINTER("冬天", 4) { @Override public void doSomething() { System.out.println("冬天来了,白雪皑皑"); } }; private String name; private int index; Season(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } public static Season getSeasonById(int index) { Season[] seasons = Season.values(); for(Season season : seasons) { if(season.getIndex() == index) { return season; } } return null; } }
在上面的代码中,我们定义了一个Action接口,并同时实现了Season枚举类型。在每个枚举常量中,我们都覆盖了doSomething()方法,用来展示不同季节的特征。
Season season = Season.SUMMER; season.doSomething();
在使用时,我们可以直接调用该枚举类型实现的接口方法,例如上面的例子中,我们通过调用doSomething()方法来展示对应枚举类型的特征。
2、使用枚举常量的构造方法
public enum Season { SPRING("春天", 1), SUMMER("夏天", 2), AUTUMN("秋天", 3), WINTER("冬天", 4); private String name; private int index; Season(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } public static Season getSeasonById(int index) { Season[] seasons = Season.values(); for(Season season : seasons) { if(season.getIndex() == index) { return season; } } return null; } }
在上面的代码中,我们在Season枚举类型的构造方法中使用了两个参数name和index来初始化枚举常量。通过这种方式,我们可以在枚举类型中自定义构造方法,来满足特定的需求。
Season season = new Season("春天", 1); System.out.println(season.getName());
但是需要注意的是,这里对象season实际上是通过编译器生成一个新的Season对象来实例化的,它不是枚举类型中的常量,而是普通的对象,因此也就无法使用枚举类型定义的方法。
3、使用枚举常量的实例域
public enum Season { SPRING("春天", "一"), SUMMER("夏天", "二"), AUTUMN("秋天", "三"), WINTER("冬天", "四"); private String name; private String code; Season(String name, String code) { this.name = name; this.code = code; } public String getName() { return name; } public String getCode() { return code; } }
在上面的代码中,我们在Season枚举类型中增加了一个code实例域,用来存储各个季节的代码。通过这种方式,我们可以在枚举类型中保存更多的信息。
4、使用枚举常量的抽象方法
public enum Season { SPRING("春天", 1) { @Override public String getDesc() { return "万物复苏"; } }, SUMMER("夏天", 2) { @Override public String getDesc() { return "热情奔放"; } }, AUTUMN("秋天", 3) { @Override public String getDesc() { return "金风玉露"; } }, WINTER("冬天", 4) { @Override public String getDesc() { return "白雪皑皑"; } }; private String name; private int index; Season(String name, int index) { this.name = name; this.index = index; } public String getName() { return name; } public int getIndex() { return index; } public abstract String getDesc(); }
在上面的代码中,我们在Season枚举类型中增加了一个抽象方法getDesc(),该方法在每个枚举常量中都需要被具体实现。通过这种方式,我们可以在枚举类型中定义更多的行为,并实现多态性的效果。
Season season = Season.SUMMER; System.out.println(season.getDesc());
在使用时,我们可以通过调用枚举类型的抽象方法来获取不同季节的特点,如上面的例子,在调用getDesc()方法时会根据具体的Season枚举常量实现方法的不同而返回不同的结果。