JDK5引入了枚举,枚举就是一组常量的集合,枚举之前,我们可以一般通过如下传统方式定义一组常量,
public class Action {
public static final int ACTION_WALK = 1;
public static final int ACTION_STOP = 2;
public static final int ACTION_FIRE = 3;
}
有了枚举后,我们可以将Action定义为
public enum Action{
ACTION_WALK, ACTION_STOP, ACTION_FIRE;
}
假设现在需要一个方法,参数是整形,根据参数打印不同的信息,传统方式的代码如下:
public void tradionalPrint(int action){
if(action==Action.ACTION_WALK){
System.out.println("Action is walk..");
}else if(action==Action.ACTION_STOP){
System.out.println("Action is stop..");
}else if(action==Action.ACTION_FIRE){
System.out.println("Action is file..");
}else{
throw new IllegalArgumentException("aa");
}
}
使用enum的代码如下:
import static org.ngf.enumed.Action.*;
import org.ngf.enumed.Action;
public class EnumedPrinter {
public void enumedPrint(Enum<Action> action){
if(action==ACTION_WALK){
System.out.println("Action is walk..");
}
if(action==ACTION_STOP){
System.out.println("Action is stop..");
}
if(action==ACTION_FIRE){
System.out.println("Action is fire..");
}
}
}
如果enumedPrint入参并不是枚举定义的常量,则编译也不能通过。 因此使用枚举,不光会使代码更加简洁,而且会增加代码的安全性。
当定义完enum后, 编译器会生成一个继承java.lang.Enum的class文件,同时会往class文件添加values方法。
1)枚举遍历
可以通过values对遍历枚举:
for(Action action:Action.values()){
System.out.println("Index:"+action.ordinal() +" name:"+action.name());
}
也可以通过class遍历枚举:
for(Action action : Action.class.getEnumConstants()){
System.out.println("Index:"+action.ordinal() +" name:"+action.name());
}
2) swich case
jdk5之前switch不能用String,只能用int Integer,byte,char,short等,但是现在也支持enum
Action action = Action.ACTION_WALK;
switch(action){
case ACTION_WALK: ... break;
case ACTION_STOP: ... break;
case ACTION_FIRE: ... break;
}
3) 编译后的enum类是继承了java,lang.Enum的一个类,具有类的所有特点,如可以实现其他接口,可以有main方法,但不能不能继承其他类(Java不支持多重继承)
4)EnumSet
EnumSet<Action> es = EnumSet.noneOf(Action.class); //初始化EnumSet es.size()==0
es.add(Action.ACTION_FIRE);
System.out.println(es); //[ACTION_FIRE]
es = EnumSet.of(Action.ACTION_STOP);//根据制定元素重新创建一个EnumSet对象 输出:[ACTION_STOP]
System.out.println(es);
es = EnumSet.allOf(Action.class); //创建一个EnunSet对象,包含所有元素
for(Action a : es){
System.out.println(a.name());
}
5) EnumMap
代码如下:
abstract class Command{
public abstract void print();
}
public class EnumMaps {
public static void main(String[] args){
EnumMap<Action, Command> enumMap = new EnumMap<Action, Command>(Action.class);
enumMap.put(Action.ACTION_FIRE, new Command(){
public void print(){
System.out.println("Action Fire is printed..");
}
});
enumMap.put(Action.ACTION_STOP, new Command(){
public void print(){
System.out.println("Action Stop is printed..");
}
});
enumMap.put(Action.ACTION_WALK, new Command(){
public void print() {
System.out.println("Action Walk is printed..");
}
});
for(Map.Entry<Action, Command> e : enumMap.entrySet()){
System.out.println("Key:"+ e.getKey());
e.getValue().print();
}
}
}
输出:
Key:ACTION_WALK
Action Walk is printed..
Key:ACTION_STOP
Action Stop is printed..
Key:ACTION_FIRE
Action Fire is printed..
public class Action {
public static final int ACTION_WALK = 1;
public static final int ACTION_STOP = 2;
public static final int ACTION_FIRE = 3;
}
有了枚举后,我们可以将Action定义为
public enum Action{
ACTION_WALK, ACTION_STOP, ACTION_FIRE;
}
假设现在需要一个方法,参数是整形,根据参数打印不同的信息,传统方式的代码如下:
public void tradionalPrint(int action){
if(action==Action.ACTION_WALK){
System.out.println("Action is walk..");
}else if(action==Action.ACTION_STOP){
System.out.println("Action is stop..");
}else if(action==Action.ACTION_FIRE){
System.out.println("Action is file..");
}else{
throw new IllegalArgumentException("aa");
}
}
使用enum的代码如下:
import static org.ngf.enumed.Action.*;
import org.ngf.enumed.Action;
public class EnumedPrinter {
public void enumedPrint(Enum<Action> action){
if(action==ACTION_WALK){
System.out.println("Action is walk..");
}
if(action==ACTION_STOP){
System.out.println("Action is stop..");
}
if(action==ACTION_FIRE){
System.out.println("Action is fire..");
}
}
}
如果enumedPrint入参并不是枚举定义的常量,则编译也不能通过。 因此使用枚举,不光会使代码更加简洁,而且会增加代码的安全性。
当定义完enum后, 编译器会生成一个继承java.lang.Enum的class文件,同时会往class文件添加values方法。
1)枚举遍历
可以通过values对遍历枚举:
for(Action action:Action.values()){
System.out.println("Index:"+action.ordinal() +" name:"+action.name());
}
也可以通过class遍历枚举:
for(Action action : Action.class.getEnumConstants()){
System.out.println("Index:"+action.ordinal() +" name:"+action.name());
}
2) swich case
jdk5之前switch不能用String,只能用int Integer,byte,char,short等,但是现在也支持enum
Action action = Action.ACTION_WALK;
switch(action){
case ACTION_WALK: ... break;
case ACTION_STOP: ... break;
case ACTION_FIRE: ... break;
}
3) 编译后的enum类是继承了java,lang.Enum的一个类,具有类的所有特点,如可以实现其他接口,可以有main方法,但不能不能继承其他类(Java不支持多重继承)
4)EnumSet
EnumSet<Action> es = EnumSet.noneOf(Action.class); //初始化EnumSet es.size()==0
es.add(Action.ACTION_FIRE);
System.out.println(es); //[ACTION_FIRE]
es = EnumSet.of(Action.ACTION_STOP);//根据制定元素重新创建一个EnumSet对象 输出:[ACTION_STOP]
System.out.println(es);
es = EnumSet.allOf(Action.class); //创建一个EnunSet对象,包含所有元素
for(Action a : es){
System.out.println(a.name());
}
5) EnumMap
代码如下:
abstract class Command{
public abstract void print();
}
public class EnumMaps {
public static void main(String[] args){
EnumMap<Action, Command> enumMap = new EnumMap<Action, Command>(Action.class);
enumMap.put(Action.ACTION_FIRE, new Command(){
public void print(){
System.out.println("Action Fire is printed..");
}
});
enumMap.put(Action.ACTION_STOP, new Command(){
public void print(){
System.out.println("Action Stop is printed..");
}
});
enumMap.put(Action.ACTION_WALK, new Command(){
public void print() {
System.out.println("Action Walk is printed..");
}
});
for(Map.Entry<Action, Command> e : enumMap.entrySet()){
System.out.println("Key:"+ e.getKey());
e.getValue().print();
}
}
}
输出:
Key:ACTION_WALK
Action Walk is printed..
Key:ACTION_STOP
Action Stop is printed..
Key:ACTION_FIRE
Action Fire is printed..