1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 5848字,需瀏覽 12分鐘

         ·

        2021-05-12 16:23



        作者:叁滴水

        blog.csdn.net/qq_30285985/article/details/112849366

        前言

        項目開發(fā)中,常有一些標識的使用,<男,女>、<正常,刪除>等等。這些信息在數(shù)據(jù)庫中會以某種標識符進行保存,但是這些標識符在代碼中如何呈現(xiàn),每個開發(fā)者都有一套自己的習慣,這種個性化習慣在大型項目開發(fā)時可能會因代碼規(guī)范問題導致嚴重bug,在此,筆者闡述下在開發(fā)過程中的解決思路,使得代碼更加具有可讀性,請大家參考。

        一、常見寫法弊端展示

        1.1、字符串匹配

        在開發(fā)時將<男,女>轉(zhuǎn)換為<1,2>,然后在項目組開發(fā)時互相轉(zhuǎn)達這樣的對應(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一定是對象一定是被實例化后的嗎?如果user是null的話,直接使用會報空指針異常。
        2. 字符串直接==比對不是比對的Value。相信學習java時就會重點說明,但是不巧,開發(fā)中我也見過有這種寫法。
        3. 字符串通過eq方法比對值一般是沒有問題的,但是字符串類型的eq方法里傳入的是一個Object類型的值,因此,即使傳入一個數(shù)值類型也不會編譯錯誤。如果誤寫成“1”.equals(1)將永遠返回false。因此這種不容易發(fā)現(xià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);
        }

        因此,當比對的數(shù)值在[-128,127]的范圍中,通過==對比會返回true,否則返回false,所以如果調(diào)用接口時,返回的狀態(tài)碼是數(shù)值型的200的時候,判斷就需要注意一下。

        另外,Integer也有eq方法,與String類型一樣,傳入Object類型,Integer.equals("1")也不會編譯報錯。

        二、代碼優(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)的枚舉類型進行轉(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)機

        雖然常有項目組通過常量來使得代碼更加規(guī)范,但是通過枚舉可以在多狀態(tài)轉(zhuǎn)換的場景下使得代碼更加友好的呈現(xiàn)。

        在一個請假單的審批過程中肯定有這幾種狀態(tài)<發(fā)起審批,組長審批,經(jīng)理審批,人事備案>。狀態(tài)機代碼示例:


        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)導審批"){
          @Override
          ApprovalStatusEnum getNextStatus ()
          
        {
           return second_leader;
          }
         },
         second_leader(3,"第二個領(lǐng)導審批"){
          @Override
          ApprovalStatusEnum getNextStatus ()
          
        {
           return backups;
          }
         },
         backups(4,"備案"){
          @Override
          ApprovalStatusEnum getNextStatus ()
          
        {
           return null;
          }
         };

         private Integer code;
         private String msg;

         abstract ApprovalStatusEnum getNextStatus();
        }

        在枚舉類中定義抽象方法,并且在每個狀態(tài)中進行具體的實現(xiàn)。如此在有大量的狀態(tài)轉(zhuǎn)移的場景中(固定的審批場景,支付場景),當前狀態(tài)調(diào)用nextStatus()方法獲取下一個狀態(tài)。這種寫法可以使得代碼更加簡潔干凈,更加便于維護。

        我已經(jīng)更新了我的《10萬字Springboot經(jīng)典學習筆記》中,點擊下面小卡片,進入【武哥聊編程】,回復:筆記,即可免費獲取。

        點贊是最大的支持 

        瀏覽 21
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            久久99精品国产一区二区三区 | 久久久亚洲AⅤ无码精品爱豆传媒 | 后入少妇视频在线观看 | 91麻豆视频 | 免费看一级高潮毛片2023 | 无码一区在线观看 | 一级靠逼片 | 王李丹妮三级做爰 | 女人本色wwwwww高清视频 | 国产午夜福利视频 |