Java 枚举常用方式

除了使用常量的特性,枚举还有哪些高级用法

Posted by Rong on February 20, 2019

我们在Java中常用枚举来标识数据库表中某个字段规定的一些常量:

public enum Color {  
  RED, GREEN, BLANK, YELLOW  
} 
// 或者
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;  
    }  
    // get set 方法  
    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;  
    }  
} 

使用switch

    public enum TICKETSTATE{
        /**
         * 0:未开始
         */
        NOTSTART(0),
        /**
         * 1;执行中
         */
        START(1),

        /**
         * 2:已结束
         */
        END(2),

        /**
         * 3:暂停'
         */
        PAUSE(3);
         private int state;
        TICKETSTATE(int state) {
            this.state = state;
        }

        public static TICKETSTATE  fromTypeName(int state) {
            for (TICKETSTATE ticketState  : TICKETSTATE.values()) {
                if (ticketState.getState() == state) {
                    return ticketState;
                }
            }
            return null;
        }

        public int getState() {
            return this.state;
        }

当使用到switch判断就会优雅些:

// 查到state
TICKETSTATE state = TICKETSTATE.fromTypeName(sqlData.state);
switch (state) {
                // 状态为未开始
                case NOTSTART:
                    // 设置状态为执行中,并且添加下一个定时任务
                    couponsService.changeCouponState(dao, tmId, START.getState());
                    String endTime = couponsService.getCouponEndTime(dao, tmId);
                    couponTimer.addJob(this, tmId, START.getState(), endTime);
                    break;
                // 执行中
                case START:
                    // 设置状态为结束
                    couponsService.changeCouponState(dao, tmId, END.getState());
                    break;
                default:
                    break;
            }

参考《ThinkingInJava》第四版,当然还有几种方法,不过自己不常用。