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.*;
-
- public class EnumSets{
- public static void main(String[] args){
-
- EnumSet<Week> weeks = EnumSet.noneOf(Week.class);
- weeks.add(MON);
- System.out.println(weeks);
-
- weeks.addAll(EnumSet.of(TUE, WEN, THU));
- System.out.println(weeks);
-
- weeks = EnumSet.allOf(Week.class);
- System.out.println(weeks);
- weeks.removeAll(EnumSet.of(FRI, SAT, SUN));
- System.out.println(weeks);
-
- weeks.removeAll(EnumSet.rang(MON, WEN));
- System.out.println(weeks);
-
- 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设计模式。