您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java中枚舉的功能是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Java中枚舉的功能是什么”吧!
設(shè)定一個(gè)場(chǎng)景,業(yè)務(wù)需要我們的一個(gè)進(jìn)件有若干狀態(tài),怎么表示這些狀態(tài)呢?大部分可能會(huì)直接用static final 表示一個(gè)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;
然后接下來(lái)的業(yè)務(wù)邏輯就是用這些常量值來(lái)帶指各種基本業(yè)務(wù)含義。但是這樣的弊端也有如下
1. 它只是一個(gè)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;
我想用上面三個(gè)狀態(tài)的一個(gè)類型,而錯(cuò)誤的輸入稱了下面的一個(gè)類型怎么辦?,因?yàn)樵跇I(yè)務(wù)實(shí)現(xiàn)上他們最終展示的都是一個(gè)數(shù)字,還TM一樣!。
2. 這些變量我們只是一個(gè)編號(hào),獲得編號(hào)后如果我想知道具體含義怎么辦?你還要構(gòu)造一個(gè)編號(hào)跟含義的映射表。
3. 這些常量是static final類型的啊,在類加載的時(shí)候,如果有些地方使用了這樣常量,在類加載的間接引用會(huì)直接編程常量引用的!
這個(gè)時(shí)候用枚舉更好一些。
public enum Depot {UNPAY, PAID, TIMOUT}//0,1,2 public enum Logistics {READY, TRANSPORT, ARRIVED}// 0,1,2
然后調(diào)用的時(shí)候如果需要值可以直接這樣調(diào)用(枚舉類會(huì)自動(dòng)給實(shí)例編號(hào)默認(rèn)從0開始)
public static void main(String[] args) { System.out.println(Depot.UNPAY); System.out.println(Depot.UNPAY.ordinal()); }
但是如果這時(shí)候我們將他們的具體序號(hào)變換了咋吧?比如
//訂單狀態(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;
我們可以對(duì)枚舉類進(jìn)行豐富化操作,使用的前提是要知道枚舉類里類型一定是這個(gè)類的若干實(shí)例。其余的操作跟類和對(duì)象操作沒有任何區(qū)別!。demo如下
public enum DepotEnum { UNPAY(0, "未支付"), PAID(1, "已支付"), TIMOUT(-1, "超時(shí)"); 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中,比如我們的加減乘除。我們可以在里面實(shí)現(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(); // 這個(gè)存在的含義僅僅是替換 default } } public static void main(String[] args) { System.out.println(NormalActive.PLUS.oper(0.1, 0.2)); } }
那可能有的時(shí)候我們需要新添加功能了比如新添加一個(gè)微分(DIFFER)功能 咋辦,我是不是要添加枚舉類型,添加switch語(yǔ)句。
這個(gè)時(shí)候我們可以再對(duì)代碼進(jìn)行優(yōu)化(時(shí)刻謹(jǐn)記枚舉類型是類對(duì)實(shí)例)。
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)在要算員工加班費(fèi),規(guī)則算工作日加班2倍工資,節(jié)假日加班3倍工資。
/** *@author sowhat *類說(shuō)明:加班費(fèi)計(jì)算,工作日加班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; //超時(shí)時(shí)間 double pay(double hoursOvertime) { switch(this) { case SATURDAY:case SUNDAY: return hoursOvertime*HOURS_REST; default: return hoursOvertime*HOURS_WORK; } } }
但是這個(gè)時(shí)候我如果要添加一個(gè)51節(jié)日的呢? 我們可以考慮引入策略枚舉。然后用外部枚舉來(lái)包裝策略枚舉。
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; // 成員變量 然后定義一個(gè)外部枚舉來(lái)包裝 策略枚舉。 BetterPayDay(PayType payType) { this.payType = payType; } double pay(double hoursOvertime) { return payType.pay(hoursOvertime); } //策略枚舉 我們只定義 工作日還是節(jié)假日的薪資計(jì)算方法。 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);//抽象計(jì)算加班費(fèi)的方法 } public static void main(String[] args) { System.out.println(BetterPayDay.MONDAY.pay(7.5)); } }
感謝各位的閱讀,以上就是“Java中枚舉的功能是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Java中枚舉的功能是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。