enum关键字,即枚举,是Java SE5添加的看似很小的特性,实际上特别的好用。
枚举类型是由关键字enum修饰的, 将一组常量的有限集合创建为新的数据类型。
T[] valuese() 返回枚举常量数组 int compareTo(E o) 比较此枚举与指定对象的顺序。 Class<E> getDeclaringClass() 返回与此枚举常量的枚举类型相对应的 Class 对象。 String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明。 int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。 String toString() 返回枚举常量的名称,它包含在声明中。 static <T extends Enum<T>> T valueOf(Class<T> enumType, String name) 返回带指定名称的指定枚举类型的枚举常量。 如果不存在给定名字的示例,将会抛出异常IllegalArgumentException 示例代码: public class TextEnum { public static void main(String[] args) { Enum colorRed = Color.RED; Enum colorBlue = Color.BLUE; Enum colorDark = Color.DARK; // 返回枚举常量数据组 for (Color c: Color.values()) { System.out.println("values: " + c); } System.out.println("color = " + colorRed ); // compareTo比较此枚举与指定对象的顺序 // A.compareTo(B) // 若A在B的后面,返回1 // 若A在B的前面,返回-1 System.out.println("compareTo : " + colorBlue.compareTo(colorRed)); System.out.println("compareTo : " + colorBlue.compareTo(colorDark)); // getDeclaringClass:返回与此枚举常量的枚举类型相对应的 Class 对象 // 返回对象的名称包括包名 System.out.println("getDeclaringClass: " + colorBlue.getDeclaringClass()); // name:返回此枚举常量的名称,在其枚举声明中对其进行声明 System.out.println("name: " + colorBlue.name()); // ordinal:返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零) System.out.println("ordinal: " + colorBlue.ordinal()); // toString:返回枚举常量的名称,它包含在声明中 System.out.println("toString: " + colorBlue.toString()); // valueOf:返回带指定名称的指定枚举类型的枚举常量 System.out.println("valueOf: " + Enum.valueOf(Color.class, "RED")); } } // Log打印 values: RED values: BLUE values: DARK color = RED compareTo : 1 compareTo : -1 getDeclaringClass: class com.teaphy.observer.enum_.Color name: BLUE ordinal: 1 toString: BLUE valueOf: RED
创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类 (java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。
/** * 定义常量 */ public enum Color { RED, BLUE, DARK } // 这段代码实际上调用了3次 Enum(String name, int ordinal): new Enum<Color>("RED",0); new Enum<Color>("BLUE",1); new Enum<Color>("DARK",2);
枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
public enum Color { RED, BLUE, DARK }
JDK1.6之前的switch语句只支持int,char,enum类型。JDk1.6后switch支持enum。由于switch是要在有限的可能值 集合中进行选择。enum与switch组合是绝佳的,因为enum的名字能清楚的表明程序意欲如何,提高代码的可读性。
示例代码:
public class TextEnum { public static void main(String[] args) { Color colorRed = Color.RED; Color colorBlue = Color.BLUE; Color colorDark = Color.DARK; testSwitch(colorRed); testSwitch(colorBlue); testSwitch(colorDark); } private static void testSwitch(Color color) { switch (color) { case RED: System.out.println("Switch - color = " + RED); break; case BLUE: System.out.println("Switch - color = " + BLUE); break; case DARK: System.out.println("Switch - color = " + DARK); break; default: break; } } } } // Log打印 Switch - color = RED Switch - color = BLUE Switch - color = DARK
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且,Java要求必须先定义enum实例,如果在定义enum实例之前定义了任何方法属性,那么编译时会报错。
enum的构造方法一般有意的将访问权限设置为private.其实设置其他的访问权限也可,对enum没有任何影响。因为我们只能通过enum内部构造器创建enum实例,一旦enum定义结束,JVM将不在允许使用其他构造器来创建enum实例。
示例代码:
public enum ColorWithMethod { RED("红色", 1), GREEN("绿色", 2), WHITE("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造方法 private ColorWithMethod(String name, int index) { this.name = name; this.index = index; } // 普通方法 public static String getName(int index) { for (ColorWithMethod c : ColorWithMethod.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; } @Override public String toString() { return "ColorWithMethod{" + "name='" + name + '\'' + ", index=" + index + '}'; } } // 测试类 public class TextEnum { public static void main(String[] args) { ColorWithMethod colorWithMethod = ColorWithMethod.WHITE; System.out.println("getName: " + colorWithMethod.getName()); System.out.println("getIndex: " + colorWithMethod.getIndex()); System.out.println("ordinal: " + colorWithMethod.ordinal()); colorWithMethod.setName("紫色"); colorWithMethod.setIndex(10); System.out.println("getName: " + colorWithMethod.getName()); System.out.println("getIndex: " + colorWithMethod.getIndex()); System.out.println("ordinal: " + colorWithMethod.ordinal()); } } // Log getName: 白色 getIndex: 3 ordinal: 2 getName: 紫色 getIndex: 10 ordinal: 2
所有的枚举都继承自java.lang.Enum类,而Enum又继承于Object类。因为Java不支持多继承,枚举类不允许再继承其他的类,但是可以实现接口。
示例代码:
public enum ColorWithInterface implements IColor{ RED("红色", 1), GREEN("绿色", 2), WHITE("白色", 3), YELLO("黄色", 4); // 成员变量 private String name; private int index; // 构造方法 private ColorWithInterface(String name, int index) { this.name = name; this.index = index; } // 普通方法 public static String getName(int index) { for (ColorWithInterface c : ColorWithInterface.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; } //接口方法 @Override public String getInfo() { return this.name; } //接口方法 @Override public void print() { System.out.println(this.index+":"+this.name); } @Override public String toString() { return "ColorWithMethod{" + "name='" + name + '\'' + ", index=" + index + '}'; } } public class TextEnum { public static void main(String[] args) { // ColorWithInterface colorInterface = ColorWithInterface.GREEN; System.out.println("ColorWithInterface - getInfo: " + colorInterface.getInfo()); IColor iColor = ColorWithInterface.GREEN; System.out.println("IColor - getInfo: " + colorInterface.getInfo()); } } // Log打印 ColorWithInterface - getInfo: 绿色 IColor - getInfo: 绿色
示例代码:
public interface Food { enum Coffee implements Food{ BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO } enum Dessert implements Food{ FRUIT, CAKE, GELATO } } public class TextEnum { public static void main(String[] args) { // ColorWithInterface colorInterface = ColorWithInterface.GREEN; System.out.println("ColorWithInterface - getInfo: " + colorInterface.getInfo()); IColor iColor = ColorWithInterface.GREEN; System.out.println("IColor - getInfo: " + colorInterface.getInfo()); } } // Log打印 Food: BLACK_COFFEE Food: FRUIT
示例代码:
public enum Color { RED, BLUE, DARK } public class TextEnum { public static void main(String[] args) { // EnumSet的使用 EnumSet<Color> colorSet = EnumSet.allOf(Color.class); for (Color color : colorSet) { System.out.println("EnumSet: " + color); } // EnumMap的使用 EnumMap<Color, String> colorMap = new EnumMap(Color.class); colorMap.put(Color.RED, "红色"); colorMap.put(Color.BLUE, "红色"); colorMap.put(Color.DARK, "黑色"); for (Iterator<Map.Entry<Color, String>> iter = colorMap.entrySet().iterator(); iter.hasNext();) { Map.Entry<Color, String> entry = iter.next(); System.out.println("EnumMap: " + entry.getKey().name() + ":" + entry.getValue()); } } // Log打印 EnumSet: RED EnumSet: BLUE EnumSet: DARK EnumMap: RED:红色 EnumMap: BLUE:红色 EnumMap: DARK:黑色
参考资料
1.Java编程思想
2.JAVA EMNU
3.java enum(枚举)使用详解 + 总结