欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Java中枚舉的功能是什么

這篇文章主要講解了“Java中枚舉的功能是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java中枚舉的功能是什么”吧!

創(chuàng)新互聯(lián)是專業(yè)的沐川網(wǎng)站建設(shè)公司,沐川接單;提供成都做網(wǎng)站、網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行沐川網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

一,枚舉的引出

設(shè)定一個場景,業(yè)務(wù)需要我們的一個進件有若干狀態(tài),怎么表示這些狀態(tài)呢?大部分可能會直接用static final 表示一個int類型的變量。如下:

    //訂單狀態(tài)
    public static final int ORDER_DEPOT_UNPAY = 0;
    public static final int ORDER_DEPOT_PAID = 1;
    public static final int ORDER_DEPOT_TIMOUT = 2;

然后接下來的業(yè)務(wù)邏輯就是用這些常量值來帶指各種基本業(yè)務(wù)含義。但是這樣的弊端也有如下

1. 它只是一個int類型的數(shù)據(jù)而已,如果我們定義了別的變量然后數(shù)字跟他一樣怎么辦?比如

    public static final int ORDER_LOGISTICS_READY = 0;
    public static final int ORDER_LOGISTICS_TRANSPORT = 1;
    public static final int ORDER_LOGISTICS_ARRIVED = 2;

我想用上面三個狀態(tài)的一個類型,而錯誤的輸入稱了下面的一個類型怎么辦?,因為在業(yè)務(wù)實現(xiàn)上他們最終展示的都是一個數(shù)字,還TM一樣!。

2. 這些變量我們只是一個編號,獲得編號后如果我想知道具體含義怎么辦?你還要構(gòu)造一個編號跟含義的映射表。

3. 這些常量是static final類型的啊,在類加載的時候,如果有些地方使用了這樣常量,在類加載的間接引用會直接編程常量引用的!

這個時候用枚舉更好一些。

    public enum Depot {UNPAY, PAID, TIMOUT}//0,1,2
    public enum Logistics {READY, TRANSPORT, ARRIVED}// 0,1,2

然后調(diào)用的時候如果需要值可以直接這樣調(diào)用(枚舉類會自動給實例編號默認從0開始)

    public static void main(String[] args) {

        System.out.println(Depot.UNPAY);
        System.out.println(Depot.UNPAY.ordinal());

    }

二,枚舉進階

但是如果這時候我們將他們的具體序號變換了咋吧?比如

    //訂單狀態(tài)
    public static final int ORDER_DEPOT_UNPAY = 0;
    public static final int ORDER_DEPOT_PAID = 3; //值變化了 
    public static final int ORDER_DEPOT_TIMOUT = 2;

我們可以對枚舉類進行豐富化操作,使用的前提是要知道枚舉類里類型一定是這個類的若干實例。其余的操作跟類和對象操作沒有任何區(qū)別!。demo如下

public enum DepotEnum {
    UNPAY(0, "未支付"), PAID(1, "已支付"), TIMOUT(-1, "超時");

    private int status; //狀態(tài)
    private String desc; // 含義描述
    private String dbInfo;//其他屬性

    private DepotEnum(int status, String desc) {
        this.status = status;
        this.desc = desc;
    }

    public int getStatus() {
        return status;
    }

    public String getDesc() {
        return desc;
    }

    public String getDbInfo() {
        return dbInfo;
    }

    public int calcStatus(int params) {
        return status + params;
    }

    public static void main(String[] args) {
        for (DepotEnum e : DepotEnum.values()) {
            System.out.println(e + ":" + e.calcStatus(14));
        }
    }
    
}

三,再進階

在枚舉中如果我們的若干狀態(tài)要跟一些行綁定在一起怎么辦? JDM提供了枚舉類型也可用在switch中,比如我們的加減乘除。我們可以在里面實現(xiàn)這樣的switch 功能。

public class ActiveEnum {
	
	public enum NormalActive{
		PLUS,MINUS,MULTI,DIVIDS;
		
		double oper(double x,double y) {
			switch(this) {
			case PLUS:return x+y;
			case MINUS:return x-y;
			case MULTI:return x*y;
			case DIVIDS:return x/y;
			}
			throw new UnsupportedOperationException(); // 這個存在的含義僅僅是替換 default
		}		
	}

	public static void main(String[] args) {
		System.out.println(NormalActive.PLUS.oper(0.1, 0.2));
	}
}

那可能有的時候我們需要新添加功能了比如新添加一個微分(DIFFER)功能 咋辦,我是不是要添加枚舉類型,添加switch語句。

這個時候我們可以再對代碼進行優(yōu)化(時刻謹(jǐn)記枚舉類型是類對實例)。

public class ActiveEnum {

	public enum BetterActive{
		PLUS {
			@Override
			double oper(double x, double y) {
				return x+y;
			}
		},MINUS {
			@Override
			double oper(double x, double y) {
				return x-y;
			}
		};
		
		abstract double oper(double x,double y); // 抽象類的引入
		 
	}
	public static void main(String[] args) {
		System.out.println(NormalActive.PLUS.oper(0.1, 0.2));
	}
	
}

四,策略枚舉引入

比如我們現(xiàn)在要算員工加班費,規(guī)則算工作日加班2倍工資,節(jié)假日加班3倍工資。

/**
 *@author sowhat
 *類說明:加班費計算,工作日加班2倍,節(jié)假日3倍
 */
enum PayDay {
	MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
	
	private static final int HOURS_WORK = 2;
	private static final int HOURS_REST = 3;
	
	//超時時間
	double pay(double hoursOvertime) {
		switch(this) {
		case SATURDAY:case SUNDAY:
			return hoursOvertime*HOURS_REST;
		default:
			return hoursOvertime*HOURS_WORK;
		}
	}
}

但是這個時候我如果要添加一個51節(jié)日的呢? 我們可以考慮引入策略枚舉。然后用外部枚舉來包裝策略枚舉。

public enum BetterPayDay {
	MONDAY(PayType.WORK), TUESDAY(PayType.WORK), WEDNESDAY(
			PayType.WORK), THURSDAY(PayType.WORK), FRIDAY(PayType.WORK), 
	SATURDAY(PayType.REST), SUNDAY(PayType.REST),WUYI(PayType.REST);

	private final PayType payType; // 成員變量 然后定義一個外部枚舉來包裝 策略枚舉。

	BetterPayDay(PayType payType) {
		this.payType = payType;
	}

	double pay(double hoursOvertime) {
		return payType.pay(hoursOvertime);
	}

	//策略枚舉 我們只定義 工作日還是節(jié)假日的薪資計算方法。
	private enum PayType {
		WORK {
			double pay(double hoursOvertime) {
				return hoursOvertime*HOURS_WORK;
			}
		},
		REST {
			double pay(double hoursOvertime) {
				return hoursOvertime*HOURS_REST;
			}
		};
		private static final int HOURS_WORK = 2;
		private static final int HOURS_REST = 3;

		abstract double pay(double hoursOvertime);//抽象計算加班費的方法
	}
	
	public static void main(String[] args) {

		System.out.println(BetterPayDay.MONDAY.pay(7.5));
	}
}

感謝各位的閱讀,以上就是“Java中枚舉的功能是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java中枚舉的功能是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

新聞名稱:Java中枚舉的功能是什么
轉(zhuǎn)載來于:http://chinadenli.net/article42/gsgdhc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司網(wǎng)站內(nèi)鏈定制網(wǎng)站ChatGPT云服務(wù)器網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站