在java性能调优中经常要把字符串匹配转换为枚举型匹配。
介绍:
java.lang.Enum是JDK5.0版本新加入的类,我们所编写的枚举其实都是隐式的继承自它,既然它是类,因此会有类型安全性、编译期检查以及可将它用在变量声明中的能力。这可以把使用数值或字符串来模拟含义的常量彻底打败,枚举中的各个实例(值)都是被隐式声明为public static final的,而且你也不能将这些声明手动赋予给实例(值),编译器会自己处理。所以比较Enum实际是比较int型,比String快。
特点:
◆类型安全(Type Safety)
◆紧凑有效的枚举数值定义(Compact, Efficient Declaration of Enumerated Values)
◆无缝的和程序其它部分的交互操作(Seamless integration with other language features)
◆运行的高效率(Runtime efficiency)
适用场景:
程序中有字典组件,这些字典组件可以定义Enum型,运行比String快(起初用String是因为他能表达语言含义,容易阅 读程序,而Enum型坚固快和见其名知其意)。
应用实例:
简单使用:
/** * 颜色的枚举 * @author David Day */ public enum ColorEnum { /** * 红色 */ RED, /** * 绿色 */ GREEN, /** * 蓝色 */ BLUE; public static void main(String[] args) { // 获得枚举实例序号 int index = RED.ordinal();RED.compareTo(RED); // 返回所有的枚举实例 ColorEnum[] colors = ColorEnum.values(); // 获得实例的名称 String colorName = GREEN.name(); // 通过实例名称来获得枚举实例 ColorEnum color = ColorEnum.valueOf(colorName); /* 比较两个枚举的方法一 * 比较方式是比较枚举的ordinal */ int compare = BLUE.compareTo(BLUE); /* 比较两个枚举的方法二 * 枚举支持直接用这种逻辑表达式方式作比较 */ boolean isEqual = RED == GREEN; // 枚举支持直接用switch作选择 switch (BLUE) { case RED: break; case GREEN: break; case BLUE: break; default: break; } } }
复杂高级使用:
import java.awt.Color; import java.io.Serializable; /** * 颜色的枚举 * 是能实现接口 * 不能继承 * @author David Day */ public enum ColorEnum implements Serializable { /** * 红色 */ RED(255, 0, 0) { @Override public void doSomeThing() { System.out.println(name()); } }, /** * 绿色 */ GREEN(0, 255, 0) { @Override public void doSomeThing() { System.out.println(ordinal()); } }, /** * 蓝色 */ BLUE(0, 0, 255) { @Override public void doSomeThing() { System.out.println(toString()); } }; /** * 颜色 */ private Color color; /** * 实例化颜色枚举 * 枚举字段的实例化将会调用这个构造方法 * 必须用private修饰 * 代表只有本枚举自己能够构造 * 枚举的实例都是静态的 * 会在第一次访问的时候就生成 * @param r 红色 * @param g 绿色 * @param b 蓝色 */ private ColorEnum(int r, int g, int b) { this.color = new Color(r, g, b);; } /** * @return 颜色实体 */ public Color getColor() { return color; } /** * 定义抽象方法 * 实例必须实现它 */ abstract void doSomeThing(); public static void main(String[] args) { Color color = RED.getColor(); GREEN.doSomeThing(); } }