首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

10 個實用又偏執的 Java 編程技巧:防空指針、避免誤賦值、泛型重載陷阱

     編輯:Java 綜合教學

寫出更健壯代碼的「偏執」習慣:從字符串比較到 Switch 陷阱全方位防禦

優秀的程序員不僅寫出能跑通的代碼,更寫出經得起邊界條件、並發衝突、版本演進考驗的代碼。本文總結 10 個看似「偏執」實則極具實戰價值的 Java 防禦性編程技巧,助你構建高質量系統。

技巧 1:字符串字面量放左邊防 NPE

// Bad: user.getName().equals("admin") → NPE 風險
// Good: "admin".equals(user.getName()) → 永不拋 NPE
// Better: Objects.equals(user.getName(), "admin") // Java 7+ 推薦

原理:字面量不為 null,調用其 equals 方法安全。同理適用于 == 比較枚舉/常量。

技巧 2:File.list() 可能返回 null,必須雙重檢查

File dir = new File("/path");
if (dir.isDirectory()) { // 先確認是目錄
    String[] files = dir.list(); // Javadoc 明確說明:非目錄返回 null
    if (files != null) { // 二次防空
        for (String f : files) { /* ... */ }
    }
}

技巧 3:拒絕 -1 魔法數,用 >= 0 判斷 indexOf 結果

// Bad: str.indexOf(c) != -1
// Good: str.indexOf(c) >= 0
// Reason: 未來規範可能變更返回值(如 -2 表示忽略大小寫未找到),>=0 語義永恆不變。

技巧 4:常量放左邊防誤賦值

// Bad: if (flag = true) { ... } // 編譯通過,邏輯錯誤
// Good: if (true == flag) { ... } // 誤寫成 = 編譯直接報錯
// Best: if (flag) { ... } // 布爾變量直接判斷最清晰

技巧 5:集合/數組先判 null 再判 length/size

// Bad: if (list.size() > 0) ...
// Good: if (list != null && !list.isEmpty()) ...
// Best: CollectionUtils.isNotEmpty(list) // Apache Commons / Spring 工具類

技巧 6:默認所有方法加 final,按需開放繼承

// Bad: public void process() { ... } // 任意子類可覆蓋,破壞邏輯
// Good: public final void process() { ... } // 明確禁止覆蓋
// Principle: 開閉原則對「擴展」開放,對「修改」關閉。final 是保護核心邏輯不被意外修改的最後一道防線。

技巧 7:所有變量、參數默認 final

// Good: public void handle(final String input) { final String processed = input.trim(); ... }
// Reason: 防止中途意外重賦值導致邏輯錯誤,編譯器強制保證引用不變,利於 JIT 優化。

技巧 8:泛型重載陷阱:不要相信調用者傳入的類型

// Bad: 重載模糊
void handle(Object o) { ... }
void handle(List<String> list) { ... }
// 調用者傳入 (Object) Arrays.asList("a") → 進入 Object 重載,而非 List 重載!

// Good: 統一入口 + 內部分發
void handle(Object o) {
    if (o instanceof List) handleList((List<?>) o);
    else handleSingle(o);
}
void handleList(List<?> list) { ... }
void handleSingle(Object o) { ... }

技巧 9:Switch 絕對要有 default 拋異常

// Bad: 無 default,新增枚舉值時靜默不處理
// Good: default: throw new IllegalStateException("Unexpected value: " + value);
// Best: 使用 Java 12+ Switch Expression 編譯期強制覆蓋所有情況
String result = switch (status) {
    case SUCCESS -> "OK";
    case FAIL -> "ERROR";
    default -> throw new IllegalStateException("Unknown: " + status);
};

技巧 10:Switch case 塊必加花括號,變量作用域隔離

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved