這篇文章主要講解了“Java中枚舉的功能是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java中枚舉的功能是什么”吧!
設定一個場景,業務需要我們的一個進件有若干狀態,怎么表示這些狀態呢?大部分可能會直接用static final 表示一個int類型的變量。如下:
//訂單狀態 public static final int ORDER_DEPOT_UNPAY = 0; public static final int ORDER_DEPOT_PAID = 1; public static final int ORDER_DEPOT_TIMOUT = 2;
然后接下來的業務邏輯就是用這些常量值來帶指各種基本業務含義。但是這樣的弊端也有如下
1. 它只是一個int類型的數據而已,如果我們定義了別的變量然后數字跟他一樣怎么辦?比如
public static final int ORDER_LOGISTICS_READY = 0; public static final int ORDER_LOGISTICS_TRANSPORT = 1; public static final int ORDER_LOGISTICS_ARRIVED = 2;
我想用上面三個狀態的一個類型,而錯誤的輸入稱了下面的一個類型怎么辦?,因為在業務實現上他們最終展示的都是一個數字,還TM一樣!。
2. 這些變量我們只是一個編號,獲得編號后如果我想知道具體含義怎么辦?你還要構造一個編號跟含義的映射表。
3. 這些常量是static final類型的啊,在類加載的時候,如果有些地方使用了這樣常量,在類加載的間接引用會直接編程常量引用的!
這個時候用枚舉更好一些。
public enum Depot {UNPAY, PAID, TIMOUT}//0,1,2
public enum Logistics {READY, TRANSPORT, ARRIVED}// 0,1,2然后調用的時候如果需要值可以直接這樣調用(枚舉類會自動給實例編號默認從0開始)
public static void main(String[] args) {
System.out.println(Depot.UNPAY);
System.out.println(Depot.UNPAY.ordinal());
}但是如果這時候我們將他們的具體序號變換了咋吧?比如
//訂單狀態 public static final int ORDER_DEPOT_UNPAY = 0; public static final int ORDER_DEPOT_PAID = 3; //值變化了 public static final int ORDER_DEPOT_TIMOUT = 2;
我們可以對枚舉類進行豐富化操作,使用的前提是要知道枚舉類里類型一定是這個類的若干實例。其余的操作跟類和對象操作沒有任何區別!。demo如下
public enum DepotEnum {
UNPAY(0, "未支付"), PAID(1, "已支付"), TIMOUT(-1, "超時");
private int status; //狀態
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));
}
}
}在枚舉中如果我們的若干狀態要跟一些行綁定在一起怎么辦? JDM提供了枚舉類型也可用在switch中,比如我們的加減乘除。我們可以在里面實現這樣的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語句。
這個時候我們可以再對代碼進行優化(時刻謹記枚舉類型是類對實例)。
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));
}
}比如我們現在要算員工加班費,規則算工作日加班2倍工資,節假日加班3倍工資。
/**
*@author sowhat
*類說明:加班費計算,工作日加班2倍,節假日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節日的呢? 我們可以考慮引入策略枚舉。然后用外部枚舉來包裝策略枚舉。
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);
}
//策略枚舉 我們只定義 工作日還是節假日的薪資計算方法。
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中枚舉的功能是什么”的內容了,經過本文的學習后,相信大家對Java中枚舉的功能是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。