<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何優(yōu)雅的使用枚舉

          共 6175字,需瀏覽 13分鐘

           ·

          2021-04-23 15:37

          點(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 如果是男生
           }

          如上代碼的弊端如下:

          1. user一定是對象一定是被實(shí)例化后的嗎?如果user是null的話,直接使用會報空指針異常。
          2. 字符串直接==比對不是比對的Value。相信學(xué)習(xí)java時就會重點(diǎn)說明,但是不巧,開發(fā)中我也見過有這種寫法。
          3. 字符串通過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)信息推送!

          3. try-catch-finally 和 return 是怎么執(zhí)行的?

          4. 在 SpringBoot 項目中,Spring Security 和 Shiro 該如何選擇?

          最近面試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ā)吧。

          謝謝支持喲 (*^__^*)

          瀏覽 66
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久久久久久久久久国产 | 欧美黑人干| 五月天开心色情网 | 欧美国产日韩色图 | 国产三级a三级三级 |