java 枚举抽象方法_Java枚举抽象方法实战
枚舉類型是指由一組固定的常量組合成合法值的類型。
背景需求
本次需求中,已經(jīng)定了幾個固定的常量值,每個常量值都有相同的行為,但是具體的實現(xiàn)細節(jié)不同。建議使用枚舉抽象方法,好處:結(jié)構(gòu)清晰,便于擴展。
枚舉常量方法
最常見的星期一到星期日的常量,假設(shè)每天都需要打印不同的消息。
定義一個抽象方法,用于描述打印行為。
星期常量Override抽象方法,實現(xiàn)具體的打印細節(jié)。
代碼演示如下:
public class EnumAbstract {
//對外提供方法
public void print(int key) {
keyOf(key).print();
}
public void print(WorkDays workDays){
workDays.print();
}
//獲取Key對應(yīng)的實例
private WorkDays keyOf(int key) {
switch (key) {
case 1:
return WorkDays.MONDAY;
case 2:
return WorkDays.TUESDAY;
case 3:
return WorkDays.WEDNESDAY;
case 4:
return WorkDays.THURSDAY;
case 5:
return WorkDays.FRIDAY;
case 6:
return WorkDays.SUNDAY;
case 7:
return WorkDays.SATURDAY;
default:
return null;
}
}
//最小訪問權(quán)限設(shè)計原則,根據(jù)需要設(shè)置訪問權(quán)限
private enum WorkDays {
MONDAY(1) {
@Override
protected void print() {
System.out.println(getKey()+" : 消息1");
}
}, TUESDAY(2) {
@Override
protected void print() {
System.out.println(getKey()+" : 消息2");
}
}, WEDNESDAY(3) {
@Override
protected void print() {
System.out.println(getKey()+": 消息3");
}
}, THURSDAY(4) {
@Override
protected void print() {
System.out.println(getKey()+" : 消息4");
}
}, FRIDAY(5) {
@Override
protected void print() {
System.out.println(getKey()+" : 消息5");
}
}, SATURDAY(6) {
@Override
protected void print() {
System.out.println(getKey()+" : 消息6");
}
}, SUNDAY(7) {
@Override
protected void print() {
System.out.println(getKey()+" : 消息7");
}
};
private int key;
//私有化構(gòu)造方法
private WorkDays(int key) {
this.key = key;
}
public int getKey() {
return key;
}
public void setKey(int key) {
this.key = key;
}
//抽象方法
protected abstract void print();
}
}
代碼中的訪問修飾符可根據(jù)需要修改。上述代碼僅用于演示。該代碼對外封裝細節(jié),僅提供了打印方法,使用此方法需要知道枚舉常量對應(yīng)的key值。如果知道枚舉值,可直接調(diào)用打印方法。workDays.print();
實戰(zhàn)
下面模擬實戰(zhàn)中的使用場景,遇到了一個難題,順便記錄一下。
項目中會遇到這樣的問題,頁面上需要展示枚舉變量對應(yīng)的含義,這時有2中做法:
1. 頁面根據(jù)不同枚舉變量解析對應(yīng)的含義;
2. 枚舉變量在定義的時候,把key 定義為對應(yīng)的含義。
public enum WorkDaysName {
MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"), THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六"), SUNDAY("星期日");
private String name;
WorkDaysName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
下面模擬枚舉變量在前后端交互過程中的做法。
//模擬保存枚舉到數(shù)據(jù)庫
public static void testSave() {
String key = EnumAbstract.WorkDaysName.SUNDAY.name();
//保存枚舉實例對應(yīng)的name到數(shù)據(jù)庫
System.out.println("保存枚舉實例對應(yīng)的name到數(shù)據(jù)庫 " + key);
}
//模擬從數(shù)據(jù)庫獲取
public static void testSelect() {
//模擬從數(shù)據(jù)庫獲取
EnumAbstract.WorkDaysName workDays = EnumAbstract.WorkDaysName.valueOf("SUNDAY");
System.out.println("模擬從數(shù)據(jù)庫獲取對應(yīng)的枚舉實例 " + workDays);
System.out.println("模擬從數(shù)據(jù)庫獲取對應(yīng)的枚舉實例的類型 " + workDays.getClass());
System.out.println("頁面直接展示:" + workDays + " 的name:" + workDays.getName());
}
結(jié)果:
保存枚舉實例對應(yīng)的name到數(shù)據(jù)庫: SUNDAY
模擬從數(shù)據(jù)庫獲取對應(yīng)的枚舉實例: SUNDAY
模擬從數(shù)據(jù)庫獲取對應(yīng)的枚舉實例的類型: class org.wuxinshui.boosters.designPatterns.enumAbstract.EnumAbstract$WorkDaysName
頁面直接展示:SUNDAY 的name:星期日
擴展
總結(jié)
以上是生活随笔為你收集整理的java 枚举抽象方法_Java枚举抽象方法实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 大臣的旅费_PREV-9-蓝桥
- 下一篇: java 面向组件_Java 面向对象