1.在枚举中添加方法:
Java中的枚举是一种特殊的类,不但可以添加字段,构造方法,普通方法,甚至可以添加main()方法,例子如下:
public enum Test{ //调用枚举构造方法创建枚举对象 WEST(“Go west”), NORTH(“Go north”), EAST(“Go east”), SOUTH(“Go south”); private String description; //私有构造方法 private Test(String description){ this.description = description; } public String getDescription(){ return description; } public static void main(String[] args){ for(Test witch : Test.values()){ System.out.println(witch + “: ” + witch.getDescription()); } } }
输出结果:
WEST:Go west
NORTH:Go north
EAST:Go east
SOUTH:Go south
注意:若要在枚举中定义字段和方法,必须在枚举对象的分号之后,java强制规定枚举对象必须放在枚举的最开始处。
另外,枚举的构造方法必须是private的,因为只允许在枚举内部定义枚举对象时使用,不允许在枚举类之后使用枚举的构造方法。
2.switch分支语句中使用枚举:
Java的switch分支语句中,switch的条件只能是整数数值类型,在JDK5以后枚举之后,由于枚举对象的顺序也是整数数值,因此switch也支持枚举,例子如下:
enum Signal{GREEN, YELLOW, RED} public class TrafficLight{ Signal color = Signal.RED; public void change(){ switch(color){ case RED: color = Signal.GREEN; break; case GREEN: color = Signal.YELLOW; break; case YELLOW: color = Signal.RED; break; } } public String toString(){ return “The traffic light is ” + color; } public static void main(String[] args){ TrafficLight t = new TrafficLight(); for(int i=0; i<5; i++){ System.out.println(t); t.change(); } } }
输出结果:
The traffic light is RED
The traffic light is GREEN
The traffic light is YELLOW
The traffic light is RED
The traffic light is GREEN
3.枚举Set:
EnumSet枚举Set是JDK5中引入的与枚举类型一起使用的专用Set实现,EnumSet中所有键都必须来自单个枚举类型,枚举Set在内部表示为位向量。位向量表示形式的EnumSet非常紧凑高效,空间性和时间性非常好,同时由于枚举对象含义清楚,因此EnumSet可以替换传统技艺int的位标志(在程序开发中,很多时候需要使用一串数字序列的位标志,每位代表不同的含义,例如网络协议等)。例子如下:
//星期枚举 public enum Week{ MON, TUE, WEN, THU, FRI, SAT, SUN } import java.util.*; //EnumSet例子 public class EnumSets{ public static void main(String[] args){ //EnumSet的noneOf方法创建指定枚举类型的空EnumSet EnumSet<Week> weeks = EnumSet.noneOf(Week.class); weeks.add(MON); System.out.println(weeks); //EnumSet的of方法创建包含指定枚举类型元素的EnumSet weeks.addAll(EnumSet.of(TUE, WEN, THU)); System.out.println(weeks); // EnumSet的allOf方法创建包含指定枚举类型所有元素的EnumSet weeks = EnumSet.allOf(Week.class); System.out.println(weeks); weeks.removeAll(EnumSet.of(FRI, SAT, SUN)); System.out.println(weeks); // EnumSet的rang方法创建包含指定枚举类型两个元素之间的EnumSet weeks.removeAll(EnumSet.rang(MON, WEN)); System.out.println(weeks); // EnumSet的complementOf方法创建指定EnumSet所不包含元素的EnumSet weeks.removeAll(EnumSet.complementOf(weeks)); System.out.println(weeks); } }
输出结果:
[MON]
[MON, TUE, WEN, THU]
[MON, TUE, WEN, THU, FRI, SAT, SUN]
[MON, TUE, WEN, THU]
[THU]
[MON, TUE, WEN, FRI, SAT, SUN]
注意:EnumSet的元素排列是依据Enum的定义顺序排列的,所有的基本操作都在固定时间内执行,速度比HashSet可能更快。
4.枚举Map:
EnumMap是与枚举类型一起使用的专用Map实现,枚举Map中所有的键都必须来自单个枚举类型,枚举Map在内部表示为数组。和EnumSet类似,EnumMap键的顺序也是和Enum的定义顺序一致,EnumMap的所有操作也都在固定时间内执行,它的速度可能比HashMap更快。
下面的例子使用EnumMap演示command interface的设计模式:public enum Directions{ EAST, NORTH, WEST, SOUTH } interface Command{ public void action(); } public class EnumMaps{ Public static void main(String[] args){ EnumMap<Directions, Command> em = new EnumMap<Directions, Command>(Directions.class); em.put(EAST, new Command(){ public void action(){ System.out.println(“Go east”); } }); em.put(NORTH, new Command(){ public void action(){ System.out.println(“Go north”); } }); em.put(WEST, new Command(){ public void action(){ System.out.println(“Go west”); } }); for(Map.Entry<Directions, Command> e : em.entrySet()){ System.out.println(e.getKey() + “: ” + e.getValue().action()); } try{ em.get(SOUTH).action(); }catch(Exception e){ System.out.println(e); } } }
输出结果:
EAST: Go east
NORTH: Go north
WEST: Go west
java.lang.NullPointerException
从最后的空指针我们可以看出,EnumMap在创建时将Enum所有元素全部放进了key中,但是如果没有使用put显式将key和value关联的话,对应的value是null。
5.枚举特定方法:
在枚举中可以定义一个抽象的公共方法,然后各个枚举实例提供具体实现,实现一种类似匿名内部类的多态方式,例子如下:
import java.util.*; import java.text.*; public enum ConstantSpecificMethod{ DATE_TIME{ String getInfo(){ return DateFormat.getDateInstance().format(new Date()); } }, CLASS_PATH{ String getInfo(){ return System.getenv(“CLASSPATH”); } }, VERSION{ String getInfo(){ return System.getProperty(“java.version”); } }; //抽象方法 abstract String getInfo(); public static void main(String[] args){ for(ConstantSpecificMethod csm : values()){ System.out.println(csm.getInfo()); } } }
通过这种多态方式,同样方便高效实现Commandinterface设计模式。