資深開發與新手的區別,往往在於對細節的把控。本文整理 6 個高頻實戰技巧,涵蓋空指針預防、API 信任度、魔數消除、誤賦值避免、集合校驗、方法最終態,助你寫出更健壯的代碼。
// ❌ 危險:variable 為 null 時拋 NPE
if (variable.equals("expected")) { ... }
// ✅ 安全:字面量調用 equals,null 直接返回 false
if ("expected".equals(variable)) { ... }
同理適用於 == 比較枚舉、常量。養成「常量在左」習慣,可消除大量無謂 NPE。
早期 File.list() 目錄不存在或非目錄時返回 null 而非空數組,直接遍歷會 NPE。
File file = new File(path);
String[] files = file.list();
if (files != null) { // 必須判空
for (String f : files) { ... }
}
原則:對外部依賴(JDK、三方庫、數據庫)的返回值永遠做防御性校驗。
// ❌ 硬編碼 -1
if (str.indexOf("x") != -1) { ... }
while ((len = in.read(buf)) != -1) { ... }
// ✅ 定義語義常量
private static final int NOT_FOUND = -1;
private static final int EOF = -1;
if (str.indexOf("x") != NOT_FOUND) { ... }
while ((len = in.read(buf)) != EOF) { ... }
若未來 JDK 修改約定(極小概率),只需改常量定義;更重要的是代碼可讀性大幅提升。
// ❌ 易手滑寫成 =,編譯不報錯(boolean 除外)
if (status = 1) { ... }
// ✅ 常量在左,誤寫成 = 編譯報錯
if (1 == status) { ... }
// ✅ 或用最終態變量
final int expected = 1;
if (expected == status) { ... }
註:=== 是 JavaScript 全等運算符,Java 無此運算符。
// ❌ 先判 length,list 為 null 時拋 NPE
if (list.size() > 0) { ... }
// ✅ 短路原則,先判 null
if (list != null && !list.isEmpty()) { ... }
// ✅ Java 8+ 更優雅
if (CollectionUtils.isNotEmpty(list)) { ... } // Apache Commons
// 或
if (list != null && list.size() > 0) { ... }
public class BaseService {
// 禁止子類覆寫,鎖定核心邏輯
public final void criticalWorkflow() {
// 模板方法模式:固定流程,子類實現抽象步驟
step1();
doBusiness(); // protected abstract
step3();
}
}
適用場景:模板方法模式、工具類工廠方法、安全敏感操作。慎用場景:需高度擴展的業務邏輯,final 會限制多態性。
| 技巧 | 核心口訣 |
|---|---|
| 防 NPE | 常量調用 equals,字面量靠左 |
| 信任邊界 | 外部返回值必判空 |
| 消魔數 | -1 入常量,語義化命名 |
| 防誤賦值 | 常量靠左,編譯器兜底 |
| 集合校驗 | 先非空,後非空 |
| final 方法 | 鎖定骨架,慎用 |
這些技巧看似微小,卻能在項目長期迭代中節省無數調試時間。建議納入團隊 Code Review 清單,培養肌肉記憶。