成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java開發人員必須掌握的11種干凈代碼最佳實踐

開發 前端
調用 toArray 時使用的是空數組(new String[0]),這種方法避免了計算列表大小的需要,并允許 toArray 方法在內部處理數組大小的調整,從而獲得更好的性能和更簡潔的代碼。

環境:Java17

1. Nulls and Optionals

反例:從方法返回null可能會導致最可怕的NullPointerException或NPE。

public String getValue() {
  // TODO
  return null ;
}

正例:使用Optional可以更明確地處理 null,避免出現此類錯誤。

public Optional<String> getValue() {
  // TODO
  return Optional.empty() ;
}

2. 使用String.valueOf()優化字符串轉換

反例:使用 + 運算符進行字符串連接。

double pi = 3.1415926 ;
String str = "" + pi ;
  • 這里,"+"操作符用于字符串轉換,涉及隱式字符串連接
  • 這種方法可能效率低下,特別是在將大量變量轉換為字符串時

正例:使用內置方法進行字符串連接。

double pi = 3.1415926 ;
String str = String.valueOf(pi) ;
  • 在這里,我們使用 valueOf() 進行字符串轉換和連接
  • 該方法專門用于將其他數據類型轉換為字符串,并對性能進行了優化

3. 使用 Arrays.copyOf()復制數組

反例:手動復制數組

int[] source = {1, 2, 3, 4, 5} ;
int [] target = new int[source.length] ;
for (int i = 0, len = source.length; i < len; i++) {
  target[i] = source[i] ;
}

這種方法效率較低,尤其是對于大數組,因為它需要進行多次迭代和元素賦值。

正例:使用 Arrays.copyOf()復制數組

int[] source = {1, 2, 3, 4, 5} ;
int[] target = Arrays.copyOf(source, source.length) ;

4. 使用 isEmpty() 檢查空集合

反例:使用 length() 或 size() 檢查字符串或集合是否為空。

String text = "Pack" ;
if (text.length() == 0) {
  // TODO
}
Set<String> datas = new HashSet<>() ;
if (datas.size() == 0) {
  // TODO
}
  • 這里,length() 用于檢查字符串是否為空,size() 用于檢查集合是否為空
  • 這些方法雖然有效,但卻降低了代碼的可讀性

正例:使用 isEmpty() 檢查字符串或集合是否為空。

String text = "Pack" ;
if (text.isEmpty()) {
  // TODO
}
Set<String> datas = new HashSet<>() ;
if (datas.isEmpty()) {
  // TODO
}
  • isEmpty() 方法可用于字符串和集合,以檢查是否為空
  • 它的時間復雜度為 O(1),因此更高效、更易讀

5. 避免并發修改異常

反例:在遍歷列表時從列表中刪除元素會導致 ConcurrentModificationException 異常。

List<String> datas = new ArrayList<>() ;
datas.add("1") ;
datas.add("2") ;
datas.add("3") ;
for (String s : datas) {
  if ("1".equals(s)) {
    datas.remove(s) ;
  }
}

輸出結果

圖片圖片

正例:使用迭代器的 remove 方法或 removeIf() 方法

List<String> datas = new ArrayList<>() ;
// add(x)
Iterator<String> it = datas.iterator() ;
while (it.hasNext()) {
  String value = it.next() ;
  if ("1".equals(value)) {
    it.remove() ; 
  }
}

你也可以使用 Java 8 中引入的 removeIf() 方法,根據給定條件刪除元素。

List<String> datas = new ArrayList<>() ;
// add(x)
datas.removeIf(item -> "1".equals(item)) ;

該方法在內部使用迭代器并移除與條件匹配的元素。這是一種更簡潔、可讀性更強的方法。

6. 預編譯正則表達式

反例:運行時編譯正則表達式

String str = "Hello, World" ;
if (str.matches("Hello.*")) {
  System.out.println(true) ;
}
  • 在這里,只要使用正則表達式,就會在運行時對其進行編譯
  • 重復使用相同的正則表達式會降低性能

正例:預編譯正則表達式

private static final Pattern PATTERN1 = Pattern.compile("Hello.*") ; 
public void validateString() {
  String str = "Hello, World" ;
  if (PATTERN1.matcher(str).matches()) {
    System.out.println(true) ;
  }
}

通過預編譯重復使用的正則表達式,并在需要時重復使用它,我們可以避免不必要的編譯,并提高性能。

7. 避免在檢索前預先檢查數據是否存在

反例:先判斷是否存在然后在獲取數據

public static void process(Map<String, String> params) {
  if (params.containsKey("action")) {
    String value = params.get("action") ;
    // TODO
  }
}
  • 在這里,我們首先檢查Map中是否存在指定的key,然后再檢索它
  • 這種預先檢查是不必要的,因為如果未找到鍵,則 Map的 get 方法會返回 null

正例:直接獲取值判斷是否null

String action = params.get("action") ;
if (action != null) {
  // TODO
}

這種方法避免了多余的檢查,使代碼更簡潔、更高效。

8. 將集合高效轉換為數組

反例:

List<String> datas = new ArrayList<>() ;
datas.add("1") ;
datas.add("2") ;
datas.add("3") ;
String[] ret = datas.toArray(new String[datas.size()]) ;

在這種方法中,首先計算列表的大小,然后創建一個新數組。這可能會影響性能,尤其是對于大數據集。

正例:

List<String> datas = new ArrayList<>() ;
// add(x)
String[] ret = datas.toArray(new String[0]) ;

在這里,調用 toArray 時使用的是空數組(new String[0]),這種方法避免了計算列表大小的需要,并允許 toArray 方法在內部處理數組大小的調整,從而獲得更好的性能和更簡潔的代碼。

9. 合理使用默認方法

反例:

public interface Logger {
  void log(String message) ;
}
public class FileLogger implements Logger {
  public void log(String message) {
    // TODO
  }
}
public class ConsoleLogger implements Logger {
  public void log(String message) {
    // TODO
  }
}

如果需要在接口中添加 logError 等新方法,則必須修改所有實現類,這可能會導致代碼維護問題和潛在錯誤。

正例:

public interface Logger {
  void log(String message) ;
  default void logError(String error) {
    // TODO
  }
}

在這里,Logger接口定義了一個默認方法(logError),它提供了記錄錯誤的默認實現。這樣實現類無需修改即可自動繼承該默認實現。

10. 使用Date/Time API

反例:使用傳統的Date類

Date birthday = new Date() ;
// TODO

這個類有很多問題,比如可變性和方法不夠清晰;該類中的大部分方法,如 getYear()、getMonth() 和 getDay() 已被棄用。

正例:使用Date/Time API(Java 8 及以后版本)中的類

LocalDate date = LocalDate.now() ;
LocalDateTime dateTime = LocalDateTime.now() ;
// TODO

在這里,使用來自Date/Time API的LocalDate、LocalDateTime類;這兩個類是不可變的,確保了線程的安全性,并為日期操作提供了清晰直觀的方法。

11. 未使用泛型

反例:

List datas = new ArrayList() ;
datas.add(10) ;
datas.add("Hello") ;

不同的數據類型混雜在列表中,可能導致運行時出錯。

正例:使用泛型可以確保類型安全,避免此類問題

List<Integer> datas = new ArrayList<>() ;
datas.add(10) ;
// 錯誤
// datas.add("Hello"

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2012-04-20 10:10:35

2025-04-02 08:11:33

2022-08-31 15:45:57

Django數據庫優化

2017-08-18 18:35:11

前端開發網站設計開源項目

2023-10-08 13:59:56

Git開發

2019-11-01 10:30:37

Reac測試工具開源

2011-04-19 11:07:50

外包開發人員IT

2018-11-21 12:21:33

Ruby框架Web應用

2018-04-08 10:08:43

開發人員工具

2021-07-16 17:05:56

Java 8語言Java 11

2021-07-08 09:57:47

Java 11Java 8開發人員

2020-05-26 13:37:43

Android 11開發人員安卓

2010-07-06 11:00:33

RationalJazz測試管理

2022-06-06 10:30:23

容器鏡像

2020-10-13 18:20:55

TCPHTTP網絡協議

2020-04-20 09:57:00

開發工具技術

2012-07-20 10:46:44

Web

2010-11-02 15:26:32

MVC開發工具

2019-11-25 09:41:28

開發者技能工具

2021-12-10 23:48:19

Java開發技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产99视频精品免费播放照片 | 色眯眯视频在线观看 | 黄色小视频入口 | 在线日韩欧美 | 国产精品久久毛片av大全日韩 | 欧美高清视频一区 | 国产精品久久久久不卡 | 日韩在线播放一区 | 在线一区二区三区 | 91成人在线视频 | 在线观看免费av网 | 日本精品一区二区三区视频 | 国产午夜精品一区二区三区 | 中文字幕精品一区二区三区精品 | 国产精品久久久久久婷婷天堂 | 亚洲日本中文 | 亚洲综合电影 | 99精品免费久久久久久久久日本 | 国产一级片av | 免费观看黄色一级片 | 99热精品在线 | 国产一区久久久 | 色频| 精品国产乱码久久久久久蜜臀 | 亚洲天堂免费 | 九九热在线视频观看这里只有精品 | 琪琪午夜伦伦电影福利片 | 日韩视频在线观看中文字幕 | av午夜电影 | 欧美一区永久视频免费观看 | 在线啊v | 精品欧美一区二区三区久久久 | 精国产品一区二区三区四季综 | 天堂一区二区三区 | 欧美a√ | 国产一区免费 | 国产福利91精品一区二区三区 | 99精品久久久久久 | 成人欧美一区二区三区在线观看 | 精品免费国产一区二区三区四区介绍 | 欧美一级在线观看 |