枚举类型( enumeration type )有时也被称作被枚举的类型( enumerated type ),或者更简单地称作枚举( enum ),这种类型在定义时,所有可能的取值都是已知的。用枚举类型代替声明一个具名整型常量public final static int NUM原因是:枚举是完全类型安全的,除了Enum枚举常量和null值外,我们无法对类型为Enum的引用赋予其他任何值,而具名整型常量则每次操作都需要来一次费时的 if 语句判断是否引用合法;其次,枚举还提供了比具名整型常量多得多的复杂用法。
一个简单的枚举例子
package enumDemo; enum Color { RED, GREEN, BLUE; } public class EnumDemo { public static void main(String[] args) { Color c = Color.BLUE; switch(c){ case RED : System.out.println("color.red"); case GREEN : System.out.println("color.green"); case BLUE : System.out.println("color.blue"); } } }
枚举类型的常用函数
package enumDemo; enum Color { RED, GREEN, BLUE; } public class EnumDemo { public static void main(String[] args) { Color[] array = Color.values(); //public static E[] values() //返回一个包含了所有枚举常量的数组,这些枚举常量按声明顺序排序 for(Color e : array){ System.out.println(e); } //public static E valueOf(String name)返回指定名称的枚举常量 System.out.println(Color.valueOf("RED")); //public final int ordinal()返回枚举常量的数序值 Color green = Color.GREEN; System.out.println(green.ordinal()); } }
枚举的复杂用法(待扩展)
package enumDemo; enum Color { RED{ String getMessage(){ return "color:red"; } }, GREEN{ String getMessage(){ return "color:green"; } }, BLUE{ String getMessage(){ return "color:blue"; } }; abstract String getMessage(); public String toString(){ return this.getMessage(); } } public class EnumDemo { public static void main(String[] args) { Color test = Color.GREEN; System.out.println(test); } }
EnumSet和EnumMap这两个集合是特别设计的,用来高效地处理enum常量。
EnumSet的用法:
package moveup; import java.util.Arrays; import java.util.EnumSet; import java.util.Set; public class EnumSetTest { public static void main(String[] args) { // 创建一个指定类型的空的集合 EnumSet<MyEnum> set1 = EnumSet.noneOf(MyEnum.class); set1.add(MyEnum.RED); set1.add(MyEnum.GREEN); set1.add(MyEnum.BLUR); showSet(set1); // 创建指定类型的所有数据的集合 EnumSet<MyEnum> set2 = EnumSet.allOf(MyEnum.class); showSet(set2); // 创建指定类型指定初始数据的集合 EnumSet<MyEnum> set3 = EnumSet.of(MyEnum.GREEN, MyEnum.RED, MyEnum.WHITE); showSet(set3); // 创建指定类型,指定范围的集合 // 包含边界数据 EnumSet<MyEnum> set4 = EnumSet.range(MyEnum.RED, MyEnum.YELLOW); showSet(set4); // 集合的用法和普通的没有区别 } /** *显示Set里面的数据。 * *@paramset */ private static void showSet(Set set) { System.out.println(Arrays.toString(set.toArray())); } } enum MyEnum { BLACK, WHITE, RED, BLUR, GREEN, YELLOW }
EnumMap的用法:
package moveup; import java.util.EnumMap; public class EnumMapTest { public enum Time { ONE, TWO, THREE, FOUR, FIVE, SIX; } public static void main(String[] args) { //创建一个空的EnumMap,使其持有具有给定枚举类型的键 EnumMap<Time, String> demo1 = new EnumMap<Time, String>(Time.class); demo1.put(Time.ONE, "1个月内"); demo1.put(Time.TWO, "1—3个月"); demo1.put(Time.THREE, "4—6个月"); demo1.put(Time.FOUR, "7—12个月"); demo1.put(Time.FIVE, "1年后"); demo1.put(Time.SIX, "不确定"); System.out.println(demo1.get(Time.ONE)); //创建一个EnumMap,其枚举类型与参数map相同,并包含map的所有元素 EnumMap<Time, String> demo2 = new EnumMap(demo1); System.out.println(demo2.get(Time.TWO)); } }