用法五:实现接口
枚举类可以用来实现接口,但不能用于继承类,因为枚举默认继承了 java.lang.Enum
类,在 Java 语言中允许实现多接口,但不能继承多个父类,实现代码如下:
public class EnumTest { public static void main(String[] args) { ColorEnum colorEnum = ColorEnum.RED; colorEnum.print(); System.out.println("颜色:" + colorEnum.getInfo()); } } interface Behaviour { void print(); String getInfo(); } enum ColorEnum implements Behaviour { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLOW("黄色", 4); private String name; private int index; private ColorEnum(String name, int index) { this.name = name; this.index = index; } @Override public void print() { System.out.println(this.index + ":" + this.name); } @Override public String getInfo() { return this.name; } }
以上程序的执行结果为:
1:红色
颜色:红色
用法六:在接口中组织枚举类
我们可以在一个接口中创建多个枚举类,用它可以很好的实现“多态”,也就是说我们可以将拥有相同特性,但又有细微实现差别的枚举类聚集在一个接口中,实现代码如下:
public class EnumTest { public static void main(String[] args) { // 赋值第一个枚举类 ColorInterface colorEnum = ColorInterface.ColorEnum.RED; System.out.println(colorEnum); // 赋值第二个枚举类 colorEnum = ColorInterface.NewColorEnum.NEW_RED; System.out.println(colorEnum); } } interface ColorInterface { enum ColorEnum implements ColorInterface { GREEN, YELLOW, RED } enum NewColorEnum implements ColorInterface { NEW_GREEN, NEW_YELLOW, NEW_RED } }
以上程序的执行结果为:
RED
NEW_RED
用法七:使用枚举集合
在 Java 语言中和枚举类相关的,还有两个枚举集合类 java.util.EnumSet
和 java.util.EnumMap
,使用它们可以实现更多的功能。
使用 EnumSet
可以保证元素不重复,并且能获取指定范围内的元素,示例代码如下:
import java.util.ArrayList; import java.util.EnumSet; import java.util.List; public class EnumTest { public static void main(String[] args) { List<ColorEnum> list = new ArrayList<ColorEnum>(); list.add(ColorEnum.RED); list.add(ColorEnum.RED); // 重复元素 list.add(ColorEnum.YELLOW); list.add(ColorEnum.GREEN); // 去掉重复数据 EnumSet<ColorEnum> enumSet = EnumSet.copyOf(list); System.out.println("去重:" + enumSet); // 获取指定范围的枚举(获取所有的失败状态) EnumSet<ErrorCodeEnum> errorCodeEnums = EnumSet.range(ErrorCodeEnum.ERROR, ErrorCodeEnum.UNKNOWN_ERROR); System.out.println("所有失败状态:" + errorCodeEnums); } } enum ColorEnum { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLOW("黄色", 4); private String name; private int index; private ColorEnum(String name, int index) { this.name = name; this.index = index; } } enum ErrorCodeEnum { SUCCESS(1000, "success"), ERROR(2001, "parameter error"), SYS_ERROR(2002, "system error"), NAMESPACE_NOT_FOUND(2003, "namespace not found"), NODE_NOT_EXIST(3002, "node not exist"), NODE_ALREADY_EXIST(3003, "node already exist"), UNKNOWN_ERROR(9999, "unknown error"); private int code; private String msg; ErrorCodeEnum(int code, String msg) { this.code = code; this.msg = msg; } public int code() { return code; } public String msg() { return msg; } }
以上程序的执行结果为:
去重:[RED, GREEN, YELLOW]
所有失败状态:[ERROR, SYS_ERROR, NAMESPACE_NOT_FOUND, NODE_NOT_EXIST, NODE_ALREADY_EXIST, UNKNOWN_ERROR]
EnumMap
与 HashMap
类似,不过它是一个专门为枚举设计的 Map
集合,相比 HashMap
来说它的性能更高,因为它内部放弃使用链表和红黑树的结构,采用数组作为数据存储的结构。
EnumMap
基本使用示例如下:
import java.util.EnumMap; public class EnumTest { public static void main(String[] args) { EnumMap<ColorEnum, String> enumMap = new EnumMap<>(ColorEnum.class); enumMap.put(ColorEnum.RED, "红色"); enumMap.put(ColorEnum.GREEN, "绿色"); enumMap.put(ColorEnum.BLANK, "白色"); enumMap.put(ColorEnum.YELLOW, "黄色"); System.out.println(ColorEnum.RED + ":" + enumMap.get(ColorEnum.RED)); } } enum ColorEnum { RED, GREEN, BLANK, YELLOW; }
以上程序的执行结果为:
RED:红色