詳解Java枚舉類(lèi)在生產(chǎn)環(huán)境中的使用方式
前言
Java枚舉在項(xiàng)目中使用非常普遍,許多人在做項(xiàng)目時(shí),一定會(huì)遇到要維護(hù)某些業(yè)務(wù)場(chǎng)景狀態(tài)的時(shí)候,往往會(huì)定義一個(gè)常量類(lèi),然后添加業(yè)務(wù)場(chǎng)景相關(guān)的狀態(tài)常量。但實(shí)際上,生產(chǎn)環(huán)境的項(xiàng)目中業(yè)務(wù)狀態(tài)的定義大部分是由枚舉類(lèi)來(lái)完成的,因?yàn)楦忧逦鞔_,還能自定義不同的方法來(lái)獲取對(duì)應(yīng)的業(yè)務(wù)狀態(tài)值,十分方便。
以下代碼均為生產(chǎn)環(huán)境已上線(xiàn)項(xiàng)目的代碼片段,僅供參考。
使用
大體分為確定業(yè)務(wù)場(chǎng)景狀態(tài)、定義枚舉類(lèi)、自定義查詢(xún)方法、測(cè)試效果等幾個(gè)部分。
1、確定業(yè)務(wù)場(chǎng)景狀態(tài)
以我工作中實(shí)際的項(xiàng)目為例,智慧醫(yī)院在掛號(hào)、門(mén)診繳費(fèi)時(shí)需要使用支付功能,我們目前實(shí)現(xiàn)了以下幾種支付形式:微信小程序支付、微信H5支付、支付寶小程序支付、支付寶生活號(hào)支付、微信醫(yī)保支付。
那么,我們就可以針對(duì)這幾種支付形式定義一個(gè)枚舉類(lèi)專(zhuān)門(mén)維護(hù),今后需要新增、修改以及刪除時(shí),只需要修改這個(gè)枚舉類(lèi)即可。
2、定義枚舉類(lèi)
public enum PayTypeEnum {
WEI_XIN_MINI_APP("1", "wxma", "微信小程序支付"),
WEI_XIN_H5("2", "wxh5", "微信H5支付"),
ZFB_MINI_APP("3", "zfbma", "支付寶小程序支付"),
ZFB_H5("4", "zfbh5", "支付寶生活號(hào)支付"),
WEI_XIN_MEDICAL("5", "wxmedical", "微信醫(yī)保支付");
private final String id;
private final String code;
private final String label;
PayTypeEnum(final String id, final String code, final String label) {
this.id = id;
this.code = code;
this.label = label;
}
public String getId() {
return id;
}
public String getCode() {
return code;
}
public String getLabel() {
return label;
}
}3、自定義查詢(xún)方法
枚舉類(lèi)我們定義了id、code、label,那么我們使用過(guò)程中可能需要根據(jù)id獲取枚舉值、根據(jù)code獲取枚舉值(本人大部分時(shí)候都定義的這兩個(gè)),甚至根據(jù)label獲取枚舉值,因此可以根據(jù)需要自定義自己的查詢(xún)方法。
/**
* 根據(jù)id獲取枚舉對(duì)象
* @param id
*/
public static PayTypeEnum findById(String id) {
for (PayTypeEnum type : PayTypeEnum.values()) {
if (type.getId().equals(id))
return type;
}
return null;
}
/**
* 根據(jù)code獲取枚舉對(duì)象
* @param code
*/
public static PayTypeEnum findByCode(String code) {
for (PayTypeEnum type : PayTypeEnum.values()) {
if (type.getCode().equals(code))
return type;
}
return null;
}
為了更完善,我們還可以再定義一個(gè)檢查枚舉類(lèi)型的方法。
/**
* 檢查支付類(lèi)型是否有效
* @param id
*/
public static void check(String id) {
if (StringUtils.isEmpty(id)) {
throw new BadRequestAlertException("無(wú)效的支付類(lèi)型", "PayTypeEnum", "無(wú)效的支付類(lèi)型");
}
for (PayTypeEnum type : PayTypeEnum.values()) {
if (type.getId().equals(id)) {
return;
}
}
throw new BadRequestAlertException("無(wú)效的支付類(lèi)型", "PayTypeEnum", "無(wú)效的支付類(lèi)型");
}
最終代碼如下:
import com.web.rest.errors.BadRequestAlertException;
import org.springframework.util.StringUtils;
public enum PayTypeEnum {
WEI_XIN_MINI_APP("1", "wxma", "微信小程序支付"),
WEI_XIN_H5("2", "wxh5", "微信H5支付"),
ZFB_MINI_APP("3", "zfbma", "支付寶小程序支付"),
ZFB_H5("4", "zfbh5", "支付寶生活號(hào)支付"),
WEI_XIN_MEDICAL("5", "wxmedical", "微信醫(yī)保支付");
private final String id;
private final String code;
private final String label;
PayTypeEnum(final String id, final String code, final String label) {
this.id = id;
this.code = code;
this.label = label;
}
public String getId() {
return id;
}
public String getCode() {
return code;
}
public String getLabel() {
return label;
}
/**
* 根據(jù)id獲取枚舉對(duì)象
* @param id
*/
public static PayTypeEnum findById(String id) {
for (PayTypeEnum type : PayTypeEnum.values()) {
if (type.getId().equals(id))
return type;
}
return null;
}
/**
* 根據(jù)code獲取枚舉對(duì)象
* @param code
*/
public static PayTypeEnum findByCode(String code) {
for (PayTypeEnum type : PayTypeEnum.values()) {
if (type.getCode().equals(code))
return type;
}
return null;
}
/**
* 檢查支付類(lèi)型是否有效
* @param id
*/
public static void check(String id) {
if (StringUtils.isEmpty(id)) {
throw new BadRequestAlertException("無(wú)效的支付類(lèi)型", "PayTypeEnum", "無(wú)效的支付類(lèi)型");
}
for (PayTypeEnum type : PayTypeEnum.values()) {
if (type.getId().equals(id)) {
return;
}
}
throw new BadRequestAlertException("無(wú)效的支付類(lèi)型", "PayTypeEnum", "無(wú)效的支付類(lèi)型");
}
}4、測(cè)試效果
public static void main(String[] args) {
System.out.println("============= 獲取枚舉類(lèi)的值 =============");
System.out.println("獲取id:" + PayTypeEnum.WEI_XIN_MINI_APP.getId());
System.out.println("獲取code:" + PayTypeEnum.WEI_XIN_MINI_APP.getCode());
System.out.println("獲取label:" + PayTypeEnum.WEI_XIN_MINI_APP.getLabel());
System.out.println("============= 根據(jù)自定義的查詢(xún)方法獲取值 =============");
System.out.println("根據(jù)id獲取枚舉對(duì)象:" + PayTypeEnum.findById("3"));
System.out.println("根據(jù)code獲取枚舉對(duì)象:" + PayTypeEnum.findByCode("zfbma"));
System.out.println("============= 類(lèi)型有效性檢查 =============");
System.out.print("檢查1:");
PayTypeEnum.check("1");
System.out.println();
System.out.print("檢查2:");
PayTypeEnum.check("999");
}
打印如下:
============= 獲取枚舉類(lèi)的值 =============
獲取id:1
獲取code:wxma
獲取label:微信小程序支付
============= 根據(jù)自定義的查詢(xún)方法獲取值 =============
根據(jù)id獲取枚舉對(duì)象:ZFB_MINI_APP
根據(jù)code獲取枚舉對(duì)象:ZFB_MINI_APP
============= 類(lèi)型有效性檢查 =============
檢查1:
檢查2:無(wú)效的支付類(lèi)型
Process finished with exit code 0
總結(jié)
Java枚舉類(lèi)的定義,大部分都和業(yè)務(wù)場(chǎng)景有關(guān),但凡是類(lèi)似于業(yè)務(wù)狀態(tài)值的定義,最好都使用枚舉類(lèi),這樣便于維護(hù)和閱讀,但每個(gè)工程師和研發(fā)團(tuán)隊(duì)的風(fēng)格都是不同的,僅以個(gè)人這些年的工作經(jīng)歷而言,往往參與一個(gè)項(xiàng)目,到后期會(huì)形成大量的枚舉類(lèi),而不是大量的常量類(lèi),常量類(lèi)頂多只有一個(gè),太多的話(huà)根本無(wú)法維護(hù),尤其是人員變更之后,新來(lái)的同事對(duì)于大量的常量類(lèi)感到頭疼,但枚舉類(lèi)卻能清晰的表達(dá)該業(yè)務(wù)的場(chǎng)景及用法。
到此這篇關(guān)于詳解Java枚舉類(lèi)在生產(chǎn)環(huán)境中的使用方式的文章就介紹到這了,更多相關(guān)Java枚舉類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用java實(shí)現(xiàn)百萬(wàn)級(jí)別數(shù)據(jù)導(dǎo)出excel的三種方式
這篇文章主要介紹了使用java實(shí)現(xiàn)百萬(wàn)級(jí)別數(shù)據(jù)導(dǎo)出excel的三種方式,有些業(yè)務(wù)系統(tǒng)可能動(dòng)輒涉及到百萬(wàn)上千萬(wàn)的數(shù)據(jù),用正常的方法效率就變得很低,今天我們來(lái)看看這幾種實(shí)現(xiàn)思路2023-03-03
快速校驗(yàn)實(shí)體類(lèi)時(shí),@Valid,@Validated,@NotNull注解無(wú)效的解決
這篇文章主要介紹了快速校驗(yàn)實(shí)體類(lèi)時(shí),@Valid,@Validated,@NotNull注解無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java如何實(shí)現(xiàn)驗(yàn)證碼驗(yàn)證功能
這篇文章主要教大家如何實(shí)現(xiàn)Java驗(yàn)證碼驗(yàn)證功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
mybatis-plus配置日志兩種實(shí)現(xiàn)方式
這篇文章主要給大家介紹了關(guān)于mybatis-plus配置日志兩種實(shí)現(xiàn)方式的相關(guān)資料,Mybatis-plus集成了日志框架,可以將程序運(yùn)行時(shí)產(chǎn)生的日志進(jìn)行記錄,方便開(kāi)發(fā)人員進(jìn)行問(wèn)題排查,需要的朋友可以參考下2023-09-09
spring?NamedContextFactory在Fegin配置及使用詳解
在我們?nèi)粘m?xiàng)目中,使用FeignClient實(shí)現(xiàn)各系統(tǒng)接口調(diào)用變得更加簡(jiǎn)單,?在各個(gè)系統(tǒng)集成過(guò)程中,難免會(huì)遇到某些系統(tǒng)的Client需要特殊的配置、返回讀取等需求。Feign使用NamedContextFactory來(lái)為每個(gè)Client模塊構(gòu)造單獨(dú)的上下文(ApplicationContext)2023-11-11
Springboot實(shí)現(xiàn)WebMvcConfigurer接口定制mvc配置詳解
這篇文章主要介紹了Springboot實(shí)現(xiàn)WebMvcConfigurer接口定制mvc配置詳解,spring?boot拋棄了傳統(tǒng)xml配置文件,通過(guò)配置類(lèi)(標(biāo)注@Configuration的類(lèi),@Configuration配置類(lèi)相當(dāng)于一個(gè)xml配置文件)以JavaBean形式進(jìn)行相關(guān)配置,需要的朋友可以參考下2023-09-09
Java 8中如何獲取參數(shù)名稱(chēng)的方法示例
這篇文章主要給大家介紹了在Java 8中如何獲取參數(shù)名稱(chēng)的方法,文中給出了詳細(xì)的介紹和方法示例,相信對(duì)大家的理解和學(xué)習(xí)具有一定的參考借鑒價(jià)值,有需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-01-01

