枚举是JDK1.5引入的新类型,可以说是一个小功能,但是它却给我们的程序开发带来了极大的便捷,本文就对它的用法做一个小结。
1 常量 在JDK 1.5之前,我们定义常量都是public final static ……,这种定义方式有一个很大的弊端就是代码紊乱,需要大量的注释。有了枚举类型,事情就好办了。比如我们要定义一组颜色常量,可以这样:
1 2 3 public enum Color{ WHITE,BLACK,RED }
是不是很清晰了呢,除了会使代码结构清晰之外,枚举还提供了许多便捷的操作……
2 Switch 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 enum Signal { GREEN, YELLOW, RED } public class TrafficLight { Signal color = Signal.RED; public void change() { switch (color) { case RED: color = Signal.GREEN; break; case YELLOW: color = Signal.RED; break; case GREEN: color = Signal.YELLOW; break; } } }
3 向枚举中添加新方法 枚举中可以自定义方法,但是必须保证先定义枚举的实例,并且在最后一个实例后面用分号结尾。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 public enum Color { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造方法 private Color(String name, int index) { this.name = name; this.index = index; } // 普通方法 public static String getName(int index) { for (Color c : Color.values()) { if (c.getIndex() == index) { return c.name; } } return null; } // get set 方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } }
补充 枚举有两个默认的方法,name()、ordinal()方法。前者可以理解为是枚举实例的名称。后者理解为枚举的编号,从0递增。
4 覆盖枚举的方法 下面给出覆盖toString()方法的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public enum Color { RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造方法 private Color(String name, int index) { this.name = name; this.index = index; } //覆盖方法 @Override public String toString() { return this.index+"_"+this.name; } }
5 实现接口 所有枚举都自动继承自java.lang.Enum类。由于Java不支持多继承,所以我们不能将枚举类继承其它的类,但是枚举类可以实现多个接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 public interface Behaviour { void print(); String getInfo(); } public enum Color implements Behaviour{ RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造方法 private Color(String name, int index) { this.name = name; this.index = index; } //接口方法 @Override public String getInfo() { return this.name; } //接口方法 @Override public void print() { System.out.println(this.index+":"+this.name); } }
6 使用接口组织枚举 有时候我们需要在一个文件中统一管理常量话,可以使用接口组织枚举。
1 2 3 4 5 6 7 8 public interface Food { enum Coffee implements Food{ BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO } enum Dessert implements Food{ FRUIT, CAKE, GELATO } }
参考资料 Java 枚举(enum) 详解7种常见的用法