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设计模式。