Java 1.5以后,有了枚举类型:
简单描述一下enum的特性:
- enum和class、interface的地位一样
- 使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。
- 枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。
- 枚举类的构造器只能是私有的。
在一些业务逻辑中,一般程序员可能定义status,type字段为 String 或者 int,这样容易出错而不好懂,最好的方式是定义成enum;
适用场景:
- 表中的状态字段,都可以设计为枚举类型,如status,type等
- 业务逻辑中的策略规则信息、异常码类型、权限码功能等;
用法一:简单的定义
以下是最简单的定义:
public enum Color { RED, GREEN, BLANK, YELLOW }
用法二:可以在switch语句中使用,Java 6 之前的switch语句支持且仅支持int,char,enum类型。而使用enum无疑是可读性最强的一种。
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; } } }
用法三:向枚举中添加新方法
向枚举类型添加自定义方法,必须先定义enum实例,并且需要在enum实例序列中添加一个分号。
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; } }
用法四:为了增加可读性和灵活性,可以覆盖枚举一些默认方法,而toString无疑是最常被客制化的。
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; } }
用法五:实现接口
枚举继承自java.lang.Enum类,由于Java不支持多继承,所以枚举对象无法继承其他类,但枚举依然可以通过接口实现泛化。
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); } }