如何優(yōu)雅的使用枚舉
點(diǎn)擊上方藍(lán)色“小哈學(xué)Java”,選擇“設(shè)為星標(biāo)” 回復(fù)“資源”獲取獨(dú)家整理的學(xué)習(xí)資料!
作者:叁滴水
blog.csdn.net/qq_30285985/article/details/112849366
前言
項目開發(fā)中,常有一些標(biāo)識的使用,<男,女>、<正常,刪除>等等。這些信息在數(shù)據(jù)庫中會以某種標(biāo)識符進(jìn)行保存,但是這些標(biāo)識符在代碼中如何呈現(xiàn),每個開發(fā)者都有一套自己的習(xí)慣,這種個性化習(xí)慣在大型項目開發(fā)時可能會因代碼規(guī)范問題導(dǎo)致嚴(yán)重bug,在此,筆者闡述下在開發(fā)過程中的解決思路,使得代碼更加具有可讀性,請大家參考。
一、常見寫法弊端展示
1.1、字符串匹配
在開發(fā)時將<男,女>轉(zhuǎn)換為<1,2>,然后在項目組開發(fā)時互相轉(zhuǎn)達(dá)這樣的對應(yīng)關(guān)系,就出現(xiàn)了如下代碼。
//如果sex是字符串,java中可以通過==對比值嗎?
if(user.getSex () == "1"){
//todo 如果是男生
}
//Sex 是字符串類型eq方法中傳入1會返回true嗎?
if(user.getSex ().equals (1)){
//todo 如果是男生
}
如上代碼的弊端如下:
user一定是對象一定是被實(shí)例化后的嗎?如果user是null的話,直接使用會報空指針異常。 字符串直接==比對不是比對的Value。相信學(xué)習(xí)java時就會重點(diǎn)說明,但是不巧,開發(fā)中我也見過有這種寫法。 字符串通過eq方法比對值一般是沒有問題的,但是字符串類型的eq方法里傳入的是一個Object類型的值,因此,即使傳入一個數(shù)值類型也不會編譯錯誤。如果誤寫成“1”.equals(1)將永遠(yuǎn)返回false。因此這種不容易發(fā)現(xiàn)的問題,常常導(dǎo)致嚴(yán)重的bug。
public static void main (String[] args)
{
String man = "1";
Integer sex = 1;
System.out.println (man.equals (sex));
//輸出
//false
}
另外,項目中直接通過字符串匹配,代碼的可讀性也會變差。多人開發(fā)的時候又有誰能夠保證你說的狀態(tài)1(String)和我說的狀態(tài)1(Integer)是同一個1呢。
1.2、數(shù)值匹配
上面列舉了字符串匹配,數(shù)值匹配同樣也有容易出問題的寫法。
public static void main (String[] args)
{
Integer man = 200;
Integer sex = 200;
System.out.println (man==sex);
Integer man1 = 2;
Integer sex1 = 2;
System.out.println (man1==sex1);
}
// false
// true
如上這種相同的寫法,卻有不同的返回值,這種就很詭異。原因就在Integer.valueOf方法中。
public static Integer valueOf(int i) {
//low = -128
// high = 127
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
因此,當(dāng)比對的數(shù)值在[-128,127]的范圍中,通過==對比會返回true,否則返回false,所以如果調(diào)用接口時,返回的狀態(tài)碼是數(shù)值型的200的時候,判斷就需要注意一下。
另外,Integer也有eq方法,與String類型一樣,傳入Object類型,Integer.equals("1")也不會編譯報錯。(搜索公眾號Java知音,回復(fù)“2021”,送你一份Java面試題寶典)
二、代碼優(yōu)化
2.1、枚舉對應(yīng)數(shù)據(jù)庫字段
例如如上定義,通過表明+Enum定義java類名,類中通過枚舉對應(yīng)到數(shù)據(jù)庫的字段,這樣可以在多人開發(fā)時避免出現(xiàn)狀態(tài)碼定位不一致問題,從而使得代碼有一個良好的可讀性。
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.HashMap;
public class UserEnum
{
@Getter
@AllArgsConstructor
public enum Sex{
Man(1,"男"),WOMAN(2,"女");
public Integer code;
public String msg;
private static HashMap<Integer,Sex> data = new HashMap<Integer,Sex>();
static {
for(Sex d : Sex.values()){
data.put(d.code, d);
}
}
public static Sex parse(Integer code) {
if(data.containsKey(code)){
return data.get(code);
}
return null;
}
}
//按照如上寫法,同樣可以有 狀態(tài)碼:正常,禁用,刪除
//public enum Status
// 角色:管理員,普通用戶
//public enum role
}
2.2、數(shù)值轉(zhuǎn)換枚舉
在開發(fā)接口給前端開發(fā)時,前端會傳入數(shù)值類型的狀態(tài),這時需要與對應(yīng)的枚舉類型進(jìn)行轉(zhuǎn)換。
代碼如下:
public static void main (String[] args)
{
//此處假如客戶端傳入狀態(tài)碼 1
Integer man =1;
UserEnum.Sex parse = UserEnum.Sex.parse (man);
System.out.println (parse);
}
2.3、枚舉使用switch
public static void main (String[] args)
{
//此處假如客戶端傳入狀態(tài)碼 1
Integer man =1;
UserEnum.Sex parse = UserEnum.Sex.parse (man);
switch (parse){
case Man:
//todo
break;
case WOMAN:
//todo
break;
}
}
2.4、枚舉狀態(tài)機(jī)
雖然常有項目組通過常量來使得代碼更加規(guī)范,但是通過枚舉可以在多狀態(tài)轉(zhuǎn)換的場景下使得代碼更加友好的呈現(xiàn)。
在一個請假單的審批過程中肯定有這幾種狀態(tài)<發(fā)起審批,組長審批,經(jīng)理審批,人事備案>。狀態(tài)機(jī)代碼示例:
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
//審批狀態(tài)碼
public enum ApprovalStatusEnum
{
START(1,"開始審批"){
@Override
ApprovalStatusEnum getNextStatus ()
{
return first_leader;
}
},
first_leader(2,"第一個領(lǐng)導(dǎo)審批"){
@Override
ApprovalStatusEnum getNextStatus ()
{
return second_leader;
}
},
second_leader(3,"第二個領(lǐng)導(dǎo)審批"){
@Override
ApprovalStatusEnum getNextStatus ()
{
return backups;
}
},
backups(4,"備案"){
@Override
ApprovalStatusEnum getNextStatus ()
{
return null;
}
};
private Integer code;
private String msg;
abstract ApprovalStatusEnum getNextStatus();
}
在枚舉類中定義抽象方法,并且在每個狀態(tài)中進(jìn)行具體的實(shí)現(xiàn)。如此在有大量的狀態(tài)轉(zhuǎn)移的場景中(固定的審批場景,支付場景),當(dāng)前狀態(tài)調(diào)用nextStatus()方法獲取下一個狀態(tài)。這種寫法可以使得代碼更加簡潔干凈,更加便于維護(hù)。
1. 以為精通Java 線程池,看到這些誤區(qū),還是年輕了...
2. Spring Boot 集成 WebSocket,輕松實(shí)現(xiàn)信息推送!
最近面試BAT,整理一份面試資料《Java面試BATJ通關(guān)手冊》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點(diǎn)“在看”,關(guān)注公眾號并回復(fù) Java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。
謝謝支持喲 (*^__^*)


