日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
這樣規(guī)范寫代碼,同事直呼“666”

一、MyBatis 不要為了多個查詢條件而寫 1 = 1

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供密山網(wǎng)站建設、密山做網(wǎng)站、密山網(wǎng)站設計、密山網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、密山企業(yè)網(wǎng)站模板建站服務,十余年密山做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。

當遇到多個查詢條件,使用where 1=1 可以很方便的解決我們的問題,但是這樣很可能會造成非常大的性能損失,因為添加了 “where 1=1 ”的過濾條件之后,數(shù)據(jù)庫系統(tǒng)就無法使用索引等查詢優(yōu)化策略,數(shù)據(jù)庫系統(tǒng)將會被迫對每行數(shù)據(jù)進行掃描(即全表掃描) 以比較此行是否滿足過濾條件,當表中的數(shù)據(jù)量較大時查詢速度會非常慢;此外,還會存在SQL 注入的風險。

反例:

 
 
 
  1.  
  2.  select count(*) from t_rule_BookInfo t where 11=1 
  3.  
  4.  AND title = #{title}  
  5.   
  6.  
  7.  AND author = #{author} 
  8.   

正例:

 
 
 
  1.  
  2.  select count(*) from t_rule_BookInfo t 
  3.  
  4.  
  5.  title = #{title}  
  6.  
  7.   
  8.  AND author = #{author} 
  9.  
  10.   

UPDATE 操作也一樣,可以用標記代替 1=1。

二、迭代entrySet() 獲取Map 的key 和value

當循環(huán)中只需要獲取Map 的主鍵key時,迭代keySet() 是正確的;但是,當需要主鍵key 和取值value 時,迭代entrySet() 才是更高效的做法,其比先迭代keySet() 后再去通過get 取值性能更佳。

反例:

 
 
 
  1. //Map 獲取value 反例: 
  2. HashMap map = new HashMap<>(); 
  3. for (String key : map.keySet()){ 
  4.     String value = map.get(key); 
  5. }

正例:

 
 
 
  1. //Map 獲取key & value 正例: 
  2. HashMap map = new HashMap<>(); 
  3. for (Map.Entry entry : map.entrySet()){ 
  4.  String key = entry.getKey(); 
  5.  String value = entry.getValue(); 
  6. }

三、使用Collection.isEmpty() 檢測空

使用Collection.size() 來檢測是否為空在邏輯上沒有問題,但是使用Collection.isEmpty() 使得代碼更易讀,并且可以獲得更好的性能;除此之外,任何Collection.isEmpty() 實現(xiàn)的時間復雜度都是O(1) ,不需要多次循環(huán)遍歷,但是某些通過Collection.size() 方法實現(xiàn)的時間復雜度可能是O(n)

反例:

 
 
 
  1. LinkedList collection = new LinkedList<>(); 
  2. if (collection.size() == 0){ 
  3.  System.out.println("collection is empty."); 
  4. }
  5. 正例:

     
     
     
    1. LinkedList collection = new LinkedList<>(); 
    2. if (collection.isEmpty()){ 
    3.     System.out.println("collection is empty."); 
    4. //檢測是否為null 可以使用CollectionUtils.isEmpty() 
    5. if (CollectionUtils.isEmpty(collection)){
    6.      System.out.println("collection is null."); 
    7. }
    8. 四、初始化集合時盡量指定其大小

      盡量在初始化時指定集合的大小,能有效減少集合的擴容次數(shù),因為集合每次擴容的時間復雜度很可能時O(n),耗費時間和性能。

      反例:

       
       
       
      1. //初始化list,往list 中添加元素反例:
      2. int[] arr = new int[]{1,2,3,4}; 
      3. List list = new ArrayList<>(); 
      4. for (int i : arr){ 
      5.  list.add(i); 
      6. }

      正例:

       
       
       
      1. //初始化list,往list 中添加元素正例: 
      2. int[] arr = new int[]{1,2,3,4}; 
      3. //指定集合list 的容量大小 
      4. List list = new ArrayList<>(arr.length); 
      5. for (int i : arr){ 
      6.     list.add(i); 
      7. }

      五、使用StringBuilder 拼接字符串

      一般的字符串拼接在編譯期Java 會對其進行優(yōu)化,但是在循環(huán)中字符串的拼接Java 編譯期無法執(zhí)行優(yōu)化,所以需要使用StringBuilder 進行替換。

      反例:

       
       
       
      1. //在循環(huán)中拼接字符串反例 
      2. String str = ""; 
      3. for (int i = 0; i < 10; i++){ 
      4.     //在循環(huán)中字符串拼接Java 不會對其進行優(yōu)化 
      5.     str += i; 
      6. }

      正例:

       
       
       
      1. //在循環(huán)中拼接字符串正例 
      2. String str1 = "Love"; 
      3. String str2 = "Courage"; 
      4. String strConcat = str1 + str2;  //Java 編譯器會對該普通模式的字符串拼接進行優(yōu)化 
      5. StringBuilder sb = new StringBuilder(); 
      6. for (int i = 0; i < 10; i++){ 
      7.    //在循環(huán)中,Java 編譯器無法進行優(yōu)化,所以要手動使用StringBuilder 
      8.     sb.append(i); 
      9. }

      六、若需頻繁調(diào)用Collection.contains 方法則使用Set

      在Java 集合類庫中,List的contains 方法普遍時間復雜度為O(n),若代碼中需要頻繁調(diào)用contains 方法查找數(shù)據(jù)則先將集合list 轉(zhuǎn)換成HashSet 實現(xiàn),將O(n) 的時間復雜度將為O(1)。

      反例:

       
       
       
      1. //頻繁調(diào)用Collection.contains() 反例 
      2. List list = new ArrayList<>(); 
      3. for (int i = 0; i <= Integer.MAX_VALUE; i++){ 
      4.     //時間復雜度為O(n) 
      5.     if (list.contains(i)) 
      6.     System.out.println("list contains "+ i); 
      7. }
      8. 正例:

         
         
         
        1. //頻繁調(diào)用Collection.contains() 正例 
        2. List list = new ArrayList<>(); 
        3. Set set = new HashSet<>(); 
        4. for (int i = 0; i <= Integer.MAX_VALUE; i++){ 
        5.     //時間復雜度為O(1) 
        6.     if (set.contains(i)){ 
        7.         System.out.println("list contains "+ i); 
        8.     } 
        9. }
        10. 七、使用靜態(tài)代碼塊實現(xiàn)賦值靜態(tài)成員變量

          對于集合類型的靜態(tài)成員變量,應該使用靜態(tài)代碼塊賦值,而不是使用集合實現(xiàn)來賦值。

          反例:

           
           
           
          1. //賦值靜態(tài)成員變量反例
          2.  private static Map map = new HashMap(){ 
          3.     { 
          4.         map.put("Leo",1); 
          5.         map.put("Family-loving",2); 
          6.         map.put("Cold on the out side passionate on the inside",3); 
          7.     } 
          8. };
          9.  private static List list = new ArrayList<>(){ 
          10.     { 
          11.         list.add("Sagittarius"); 
          12.         list.add("Charming"); 
          13.         list.add("Perfectionist"); 
          14.     } 
          15. };

          正例:

           
           
           
          1. //賦值靜態(tài)成員變量正例 
          2. private static Map map = new HashMap(); 
          3. static { 
          4.     map.put("Leo",1); 
          5.     map.put("Family-loving",2); 
          6.     map.put("Cold on the out side passionate on the inside",3); 
          7. private static List list = new ArrayList<>();
          8.  static { 
          9.     list.add("Sagittarius"); 
          10.     list.add("Charming"); 
          11.     list.add("Perfectionist"); 
          12. }

          八、刪除未使用的局部變量、方法參數(shù)、私有方法、字段和多余的括號。

          九、工具類中屏蔽構造函數(shù)

          工具類是一堆靜態(tài)字段和函數(shù)的集合,其不應該被實例化;但是,Java 為每個沒有明確定義構造函數(shù)的類添加了一個隱式公有構造函數(shù),為了避免不必要的實例化,應該顯式定義私有構造函數(shù)來屏蔽這個隱式公有構造函數(shù)。

          反例:

           
           
           
          1. public class PasswordUtils { 
          2. //工具類構造函數(shù)反例 
          3. private static final Logger LOG = LoggerFactory.getLogger(PasswordUtils.class); 
          4. public static final String DEFAULT_CRYPT_ALGO = "PBEWithMD5AndDES";
          5. public static String encryptPassword(String aPassword) throws IOException { 
          6.     return new PasswordUtils(aPassword).encrypt(); 
          7. }

          正例:

           
           
           
          1. public class PasswordUtils { 
          2. //工具類構造函數(shù)正例 
          3. private static final Logger LOG = LoggerFactory.getLogger(PasswordUtils.class); 
          4. //定義私有構造函數(shù)來屏蔽這個隱式公有構造函數(shù) 
          5. private PasswordUtils(){}
          6. public static final String DEFAULT_CRYPT_ALGO = "PBEWithMD5AndDES"; 
          7. public static String encryptPassword(String aPassword) throws IOException { 
          8.     return new PasswordUtils(aPassword).encrypt(); 
          9. }

          十、刪除多余的異常捕獲并跑出

          用catch 語句捕獲異常后,若什么也不進行處理,就只是讓異常重新拋出,這跟不捕獲異常的效果一樣,可以刪除這塊代碼或添加別的處理。

          反例:

           
           
           
          1. //多余異常反例 
          2. private static String fileReader(String fileName)throws IOException{ 
          3.     try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) { 
          4.         String line; 
          5.         StringBuilder builder = new StringBuilder(); 
          6.         while ((line = reader.readLine()) != null) { 
          7.             builder.append(line); 
          8.         } 
          9.         return builder.toString(); 
          10.     } catch (Exception e) { 
          11.         //僅僅是重復拋異常 未作任何處理 
          12.         throw e; 
          13.     } 
          14. }

          正例:

           
           
           
          1. //多余異常正例 
          2. private static String fileReader(String fileName)throws IOException{ 
          3.     try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) { 
          4.         String line; 
          5.         StringBuilder builder = new StringBuilder(); 
          6.         while ((line = reader.readLine()) != null) { 
          7.             builder.append(line); 
          8.         } 
          9.         return builder.toString(); 
          10.         //刪除多余的拋異常,或增加其他處理: 
          11.         /*catch (Exception e) { 
          12.             return "fileReader exception"; 
          13.         }*/ 
          14.     } 
          15. }

          十一、字符串轉(zhuǎn)化使用String.valueOf(value) 代替 " " + value

          把其它對象或類型轉(zhuǎn)化為字符串時,使用String.valueOf(value) 比 ""+value 的效率更高。

          反例:

           
           
           
          1. //把其它對象或類型轉(zhuǎn)化為字符串反例: 
          2. int num = 520; 
          3. // "" + value 
          4. String strLove = "" + num;

          正例:

           
           
           
          1. //把其它對象或類型轉(zhuǎn)化為字符串正例: 
          2. int num = 520; 
          3. // String.valueOf() 效率更高 
          4. String strLove = String.valueOf(num);

          十二、避免使用BigDecimal(double)

          BigDecimal(double) 存在精度損失風險,在精確計算或值比較的場景中可能會導致業(yè)務邏輯異常。

          反例:

           
           
           
          1. // BigDecimal 反例     
          2. BigDecimal bigDecimal = new BigDecimal(0.11D);

          正例:

           
           
           
          1. // BigDecimal 正例 
          2. BigDecimal bigDecimalbigDecimal1 = bigDecimal.valueOf(0.11D);

          十三、返回空數(shù)組和集合而非 null

          若程序運行返回null,需要調(diào)用方強制檢測null,否則就會拋出空指針異常;返回空數(shù)組或空集合,有效地避免了調(diào)用方因為未檢測null 而拋出空指針異常的情況,還可以刪除調(diào)用方檢測null 的語句使代碼更簡潔。

          反例:

           
           
           
          1. //返回null 反例 
          2. public static Result[] getResults() { 
          3.     return null;
          4.  } 
          5. public static List getResultList() { 
          6.     return null; 
          7. public static Map getResultMap() { 
          8.     return null; 
          9. }

          正例:

           
           
           
          1. //返回空數(shù)組和空集正例 
          2. public static Result[] getResults() { 
          3.     return new Result[0]; 
          4. public static List getResultList() { 
          5.     return Collections.emptyList(); 
          6. public static Map getResultMap() { 
          7.     return Collections.emptyMap(); 
          8. }

          十四、優(yōu)先使用常量或確定值調(diào)用equals 方法

          對象的equals 方法容易拋空指針異常,應使用常量或確定有值的對象來調(diào)用equals 方法。

          反例:

           
           
           
          1. //調(diào)用 equals 方法反例 
          2. private static boolean fileReader(String fileName)throws IOException{ 
          3.  // 可能拋空指針異常
          4.   return fileName.equals("Charming"); 
          5. }

          正例:

           
           
           
          1. //調(diào)用 equals 方法正例 
          2. private static boolean fileReader(String fileName)throws IOException{ 
          3.     // 使用常量或確定有值的對象來調(diào)用 equals 方法 
          4.     return "Charming".equals(fileName);  
          5.     //或使用:java.util.Objects.equals() 方法 
          6.    return Objects.equals("Charming",fileName); 
          7. }

          十五、枚舉的屬性字段必須是私有且不可變

          枚舉通常被當做常量使用,如果枚舉中存在公共屬性字段或設置字段方法,那么這些枚舉常量的屬性很容易被修改;理想情況下,枚舉中的屬性字段是私有的,并在私有構造函數(shù)中賦值,沒有對應的Setter 方法,最好加上final 修飾符。

          反例:

           
           
           
          1. public enum SwitchStatus { 
          2.     // 枚舉的屬性字段反例 
          3.     DISABLED(0, "禁用"), 
          4.     ENABLED(1, "啟用"); 
          5.     public int value; 
          6.     private String description; 
          7.     private SwitchStatus(int value, String description) { 
          8.         this.value = value; 
          9.         this.description = description; 
          10.     } 
          11.     public String getDescription() { 
          12.         return description; 
          13.     } 
          14.     public void setDescription(String description) { 
          15.         this.description = description; 
          16.     } 
          17. }

          正例:

           
           
           
          1. public enum SwitchStatus { 
          2.     // 枚舉的屬性字段正例 
          3.     DISABLED(0, "禁用"), 
          4.     ENABLED(1, "啟用"); 
          5.     // final 修飾 
          6.     private final int value; 
          7.     private final String description; 
          8.     private SwitchStatus(int value, String description) { 
          9.         this.value = value; 
          10.         this.description = description; 
          11.     } 
          12.     // 沒有Setter 方法 
          13.     public int getValue() { 
          14.         return value; 
          15.     } 
          16.     public String getDescription() { 
          17.         return description; 
          18.     } 
          19. }

          十六、tring.split(String regex)部分關鍵字需要轉(zhuǎn)譯

          使用字符串String 的plit 方法時,傳入的分隔字符串是正則表達式,則部分關鍵字(比如 .[]()| 等)需要轉(zhuǎn)義。

          反例:

           
           
           
          1. // String.split(String regex) 反例 
          2. String[] split = "a.ab.abc".split("."); 
          3. System.out.println(Arrays.toString(split));   // 結果為[] 
          4. String[] split1 = "a|ab|abc".split("|"); 
          5. System.out.println(Arrays.toString(split1));  // 結果為["a", "|", "a", "b", "|", "a", "b", "c"]

          正例:

           
           
           
          1. // String.split(String regex) 正例 
          2. // . 需要轉(zhuǎn)譯 
          3. String[] split2 = "a.ab.abc".split("\\."); 
          4. System.out.println(Arrays.toString(split2));  // 結果為["a", "ab", "abc"] 
          5. // | 需要轉(zhuǎn)譯 
          6. String[] split3 = "a|ab|abc".split("\\|"); 
          7. System.out.println(Arrays.toString(split3));  // 結果為["a", "ab", "abc"] 

          本文標題:這樣規(guī)范寫代碼,同事直呼“666”
          網(wǎng)站鏈接:http://www.5511xx.com/article/coiodhc.html