Java枚举学习笔记

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..
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值