DK1.5引入了新的类型——枚举。在 Java 中它虽然算个“小”功能,却给我的开发带来了“大”方便。
用法一:常量
在JDK1.5 之前,我们定义常量都是: publicstaticfianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
?
Java代码
class="dp-j">
- public?enum?Color?{??
- ??RED,?GREEN,?BLANK,?YELLOW??
- }??
?
用法二:switch
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
?
Java代码
- enum?Signal?{??
- ????GREEN,?YELLOW,?RED??
- }??
- public?class?TrafficLight?{??
- ????Signal?color?=?Signal.RED;??
- ????public?void?change()?{??
- ????????switch?(color)?{??
- ????????case?RED:??
- ????????????color?=?Signal.GREEN;??
- ????????????break;??
- ????????case?YELLOW:??
- ????????????color?=?Signal.RED;??
- ????????????break;??
- ????????case?GREEN:??
- ????????????color?=?Signal.YELLOW;??
- ????????????break;??
- ????????}??
- ????}??
- }??
?
?
用法三:向枚举中添加新方法
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。
?
Java代码
- public?enum?Color?{??
- ????RED("红色",?1),?GREEN("绿色",?2),?BLANK("白色",?3),?YELLO("黄色",?4);??
- ??????
- ????private?String?name;??
- ????private?int?index;??
- ??????
- ????private?Color(String?name,?int?index)?{??
- ????????this.name?=?name;??
- ????????this.index?=?index;??
- ????}??
- ??????
- ????public?static?String?getName(int?index)?{??
- ????????for?(Color?c?:?Color.values())?{??
- ????????????if?(c.getIndex()?==?index)?{??
- ????????????????return?c.name;??
- ????????????}??
- ????????}??
- ????????return?null;??
- ????}??
- ??????
- ????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;??
- ????}??
- }??
?
?
用法四:覆盖枚举的方法
下面给出一个toString()方法覆盖的例子。
?
Java代码
- public?enum?Color?{??
- ????RED("红色",?1),?GREEN("绿色",?2),?BLANK("白色",?3),?YELLO("黄色",?4);??
- ??????
- ????private?String?name;??
- ????private?int?index;??
- ??????
- ????private?Color(String?name,?int?index)?{??
- ????????this.name?=?name;??
- ????????this.index?=?index;??
- ????}??
- ??????
- ????@Override??
- ????public?String?toString()?{??
- ????????return?this.index+"_"+this.name;??
- ????}??
- }??
?
用法五:实现接口
所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
?
Java代码
- public?interface?Behaviour?{??
- ????void?print();??
- ????String?getInfo();??
- }??
- public?enum?Color?implements?Behaviour{??
- ????RED("红色",?1),?GREEN("绿色",?2),?BLANK("白色",?3),?YELLO("黄色",?4);??
- ??????
- ????private?String?name;??
- ????private?int?index;??
- ??????
- ????private?Color(String?name,?int?index)?{??
- ????????this.name?=?name;??
- ????????this.index?=?index;??
- ????}??
- ??
- ????@Override??
- ????public?String?getInfo()?{??
- ????????return?this.name;??
- ????}??
- ??????
- ????@Override??
- ????public?void?print()?{??
- ????????System.out.println(this.index+":"+this.name);??
- ????}??
- }??
?
用法六:使用接口组织枚举
?
Java代码
- public?interface?Food?{??
- ????enum?Coffee?implements?Food{??
- ????????BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO??
- ????}??
- ????enum?Dessert?implements?Food{??
- ????????FRUIT,?CAKE,?GELATO??
- ????}??
- }??
?
用法七:关于枚举集合的使用
java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。
用法八:带抽象方法的枚举
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time=time;}
}
?