Java 枚举类型的使用

Java枚举类型的使用,亲测有效

下面是Java模仿实现枚举类型,可以大概了解其原理:

package learn.java.enumeration;

import java.util.HashMap;
import java.util.Map;

/** 
* @author  作者 : YUHU YUAN
* @date 创建时间:2016年12月9日 下午10:31:37 
* @version 1.0  
*/

public abstract class WeekDateYuan {



    public abstract WeekDateYuan nextDay();

    public abstract WeekDateYuan proDay();

    public abstract String toString();

    private String name;

    private int order;



    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }

    public WeekDateYuan(String name, int order){
        this.name = name;
        this.order = order;
    }


    public static final WeekDateYuan Monday = new WeekDateYuan("Monday",1){
        @Override
        public WeekDateYuan nextDay(){
            return Tuesday;

        }
        @Override
        public WeekDateYuan proDay(){
            return Sunday;
        }
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "Monday";

        }
    };
    public static final WeekDateYuan Tuesday = new WeekDateYuan("Tuesday",2){
        @Override
        public WeekDateYuan nextDay(){
            return Wednesday;

        }
        @Override
        public WeekDateYuan proDay(){
            return Monday;
        }
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "Tuesday";

        }
    };
    public static final WeekDateYuan Wednesday = new WeekDateYuan("Wednesday",3){
        @Override
        public WeekDateYuan nextDay(){
            return Thrusday;

        }
        @Override
        public WeekDateYuan proDay(){
            return Tuesday;
        }
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "Wednesday";

        }
    };
    public static final WeekDateYuan Thrusday = new WeekDateYuan("Thrusday",4){
        @Override
        public WeekDateYuan nextDay(){
            return Friday;

        }
        @Override
        public WeekDateYuan proDay(){
            return Wednesday;
        }
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "Thrusday";

        }
    };
    public static final WeekDateYuan Friday = new WeekDateYuan("Friday",5){
        @Override
        public WeekDateYuan nextDay(){
            return Saturday;

        }
        @Override
        public WeekDateYuan proDay(){
            return Thrusday;
        }
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "Friday";

        }
    };
    public static final WeekDateYuan Saturday = new WeekDateYuan("Monday",6){
        @Override
        public WeekDateYuan nextDay(){
            return Sunday;

        }
        @Override
        public WeekDateYuan proDay(){
            return Friday;
        }
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "Saturday";

        }
    };
    public static final WeekDateYuan Sunday = new WeekDateYuan("Sunday",7){
        @Override
        public WeekDateYuan nextDay(){
            return Saturday;

        }
        @Override
        public WeekDateYuan proDay(){
            return Monday;
        }
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "Sunday";

        }
    };

    private static Map<String, WeekDateYuan> valueMap = new HashMap<>();

      /** 
     * 保存枚举成员 
     */  
    public static WeekDateYuan[] values = {  
        Monday, Tuesday, Wednesday, Thrusday, Friday, Saturday, Sunday 
    };  


    //初始化  
    static {  
        valueMap.put("Monday", values[0]);  
        valueMap.put("Tuesday", values[1]);  
        valueMap.put("Wednesday", values[2]);  
        valueMap.put("Thrusday", values[3]);  
        valueMap.put("Friday", values[4]);  
        valueMap.put("Saturday", values[5]);  
        valueMap.put("Sunday", values[6]);  
    } 

    public static WeekDateYuan valueOf(String name) {  
        if (name.equalsIgnoreCase("MON")) {  
            return Monday;  
        } else if (name.equalsIgnoreCase("TUES")) {  
            return Tuesday;  
        } else if (name.equalsIgnoreCase("WEDES")) {  
            return Wednesday;  
        } else if (name.equalsIgnoreCase("THURS")) {  
            return Thrusday;  
        } else if (name.equalsIgnoreCase("FRI")) {  
            return Friday;  
        } else if (name.equalsIgnoreCase("SATUR")) {  
            return Saturday;  
        } else if (name.equalsIgnoreCase("SUN")) {  
            return Sunday;  
        } else {  
            throw new IllegalArgumentException("找不到" + name + "枚举类型!");  
        }  
    }  

    public static WeekDateYuan valueOf_2(String name) {  
        WeekDateYuan value = valueMap.get(name.toUpperCase());  
        if (value == null) {  
            throw new IllegalArgumentException("找不到" + name + "枚举类型!");  
        }  
        return value;  
    }
}

下面是具体的枚举类的使用:

package learn.java.enumeration;



/**
 * @author YuanYuhu
 *
 */
public enum WeekdateYu {


    Monday("Monday", 1) ,Tuesday("Tuesday",2),Wednesday("Wednesday", 3),
    Thrusday("Thrusday", 4),Friday("Friday", 5),Saturday("Monday", 6),Sunday("Sunday", 7);

    private String name;

    private int order;

    public static WeekdateYu nextDay(WeekdateYu element){

        WeekdateYu next = null;

        WeekdateYu[] weeks = WeekdateYu.values();

        next = weeks[(element.ordinal()+1)%7];

        return next;
    }

    public  static WeekdateYu proDay(WeekdateYu element){

        WeekdateYu pre = null;

        WeekdateYu[] weeks = WeekdateYu.values();
        int order = (element.ordinal()-1) > 0 ? (element.ordinal()-1):(element.ordinal()-1+7);

        pre = weeks[order];

        return pre;

    }


    WeekdateYu(String name, int order){
        this.name = name;
        this.order = order;
    }

    public String getName(){
        return name;
    }
    public int getOrder(){
        return order;
    }


}
package learn.java.enumeration;

/** 
* @author  作者 : YUHU YUAN
* @date 创建时间:2016年12月9日 下午10:23:10 
* @version 1.0  
* 
*/
public enum WeekDateEnum {  

    MON {  

        @Override  
        public WeekDateEnum nextDay() {  
            return TUES;  
        }  

        @Override  
        public WeekDateEnum preDay() {  
            return SUN;  
        }  

    },  TUES {  

        @Override  
        public WeekDateEnum nextDay() {  
            return WEDNES;  
        }  

        @Override  
        public WeekDateEnum preDay() {  
            return MON;  
        }  

    },  WEDNES {  

        @Override  
        public WeekDateEnum nextDay() {  
            return THURS;  
        }  

        @Override  
        public WeekDateEnum preDay() {  
            return TUES;  
        }  

    },  THURS {  

        @Override  
        public WeekDateEnum nextDay() {  
            return FRI;  
        }  

        @Override  
        public WeekDateEnum preDay() {  
            return WEDNES;  
        }  

    },  FRI {  

        @Override  
        public WeekDateEnum nextDay() {  
            return SATUR;  
        }  

        @Override  
        public WeekDateEnum preDay() {  
            return THURS;  
        }  

    },  SATUR {  

        @Override  
        public WeekDateEnum nextDay() {  
            return SATUR;  
        }  

        @Override  
        public WeekDateEnum preDay() {  
            return FRI;  
        }  

    },  SUN {  

        @Override  
        public WeekDateEnum nextDay() {  
            return SATUR;  
        }  

        @Override  
        public WeekDateEnum preDay() {  
            return MON;  
        }  

    };  

    private WeekDateEnum() {}  

    /** 
     * 下一天 
     * @return 
     */  
    public abstract WeekDateEnum nextDay();  

    /** 
     * 前一天 
     * @return 
     */  
    public abstract WeekDateEnum preDay();  
}  

针对上面的两种情况进行一下解释:
1:注意把方法声明为虚拟的和静态的两种使用方法的不同;
2:个人感觉声明为静态的是所有成员共有的方法,声明为虚拟的则是不同的成员有各自不同的实现的时候用。
3:有了枚举类型就可以更好的结合switch使用,也可以参与到设计模式里面的状态模式里面,正好这两天看这些内容。

另外,以上纯属个人观点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值