如何優(yōu)雅的使用枚舉
點(diǎn)擊上方“碼農(nóng)突圍”,馬上關(guān)注 這里是碼農(nóng)充電第一站,回復(fù)“666”,獲取一份專屬大禮包 真愛(ài),請(qǐng)?jiān)O(shè)置“星標(biāo)”或點(diǎn)個(gè)“在看
前言
一、常見(jiàn)寫(xiě)法弊端展示
1.1、字符串匹配
<男,女>轉(zhuǎn)換為<1,2>,然后在項(xiàng)目組開(kāi)發(fā)時(shí)互相轉(zhuǎn)達(dá)這樣的對(duì)應(yīng)關(guān)系,就出現(xiàn)了如下代碼。//如果sex是字符串,java中可以通過(guò)==對(duì)比值嗎?
if(user.getSex () == "1"){
//todo 如果是男生
}
//Sex 是字符串類型eq方法中傳入1會(huì)返回true嗎?
if(user.getSex ().equals (1)){
//todo 如果是男生
}
user一定是對(duì)象一定是被實(shí)例化后的嗎?如果user是null的話,直接使用會(huì)報(bào)空指針異常。 字符串直接==比對(duì)不是比對(duì)的Value。相信學(xué)習(xí)java時(shí)就會(huì)重點(diǎn)說(shuō)明,但是不巧,開(kāi)發(fā)中我也見(jiàn)過(guò)有這種寫(xiě)法。 字符串通過(guò)eq方法比對(duì)值一般是沒(méi)有問(wèn)題的,但是字符串類型的eq方法里傳入的是一個(gè)Object類型的值,因此,即使傳入一個(gè)數(shù)值類型也不會(huì)編譯錯(cuò)誤。如果誤寫(xiě)成“1”.equals(1)將永遠(yuǎn)返回false。因此這種不容易發(fā)現(xiàn)的問(wè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
}
1.2、數(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
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);
}
二、代碼優(yōu)化
2.1、枚舉對(duì)應(yīng)數(shù)據(jù)庫(kù)字段
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;
}
}
//按照如上寫(xiě)法,同樣可以有 狀態(tài)碼:正常,禁用,刪除
//public enum Status
// 角色:管理員,普通用戶
//public enum role
}
2.2、數(shù)值轉(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ī)
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
//審批狀態(tài)碼
public enum ApprovalStatusEnum
{
START(1,"開(kāi)始審批"){
@Override
ApprovalStatusEnum getNextStatus ()
{
return first_leader;
}
},
first_leader(2,"第一個(gè)領(lǐng)導(dǎo)審批"){
@Override
ApprovalStatusEnum getNextStatus ()
{
return second_leader;
}
},
second_leader(3,"第二個(gè)領(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();
}
- END - 最近熱文
? 如何優(yōu)雅記錄 http 請(qǐng)求/ 響應(yīng)數(shù)據(jù)? ? 如何寫(xiě)出讓同事無(wú)法維護(hù)的代碼? ? 86版西游記“紅孩兒”成中科院博士!做CTO身價(jià)過(guò)億! ? 劉強(qiáng)東的代碼水平到底有多牛? 網(wǎng)友:95年一個(gè)晚上賺5萬(wàn)!
評(píng)論
圖片
表情

