學習 Java 語法很容易,但寫出「講標準口音」的 Java 代碼需要刻意練習。許多 C/C++ 程序員轉型時,代碼雖能編譯運行,卻處處透露著「外來口音」:變量聲明靠前、偏愛 while 迴路、濫用縮寫、習慣 printf 等。這些細節雖不影響語義,卻嚴重降低代碼可讀性,讓資深 Java 開發者難以維護。本文系統梳理高頻「方言」特徵,助你蛻變為地道 Java 程式設計師。
早期 C 語言受限於識別符長度,催生了 sprintf、nmtkns 這類難讀縮寫。現代 IDE 自動補全已消除輸入負擔,Java 語言設計哲學明確:代碼被閱讀的次數遠超編寫次數,優化閱讀體驗優於縮短輸入。
// C 風格:難以理解
for (int i = 0; i < nr; i++)
for (int j = 0; j < nc; j++)
t[i][j] = s[i][j];
// Java 風格:自文檔化
for (int row = 0; row < numRows; row++)
for (int col = 0; col < numCols; col++)
target[row][col] = source[row][col];
僅保留極少數公認縮寫:max/min、in/out(流)、e/ex(異常捕獲)、num(前綴)、tmp(交換變量)。
args 而非 argvmain(String[] args) 是 Java 慣例,源自 Gosling 與 Arnold 的首本 Java 書籍。統一慣例能減少認知負荷,讓團隊專注業務邏輯而非風格爭論。
C89 強制變量在塊開頭聲明,導致聲明與使用分離、變量複用風險高。Java 允許在首次使用處聲明並初始化:
// 避免:分離聲明與賦值
int i;
i = 7;
// 推薦:合二為一
int i = 7;
唯一例外:try-catch-finally 中需在 finally 關閉資源的變量(如流對象),必須聲明在 try 外部。
將循環控制變量、臨時變量移入 for 迴路內部,利用編譯器作用域檢查防止誤用:
// 進階:所有變量封裝在 for 初始化區
for (int i = 1, high = 1, low = 1; i < 20; i++) {
System.out.println(high);
int tmp = high;
high = high + low;
low = tmp;
}
註:聲明移入循環 零性能損耗,JVM 運行時不執行聲明語句。
C++ 程序員習慣手動置 null 或調用 finalize(),但在 Java 中這屬於反模式。現代 GC(G1、ZGC)具備卓越的分代回收與壓縮能力,手動干預反而可能破壞優化策略。除非性能分析證明必要,否則別碰記憶體管理。
double 勝過 floatJava 八大基本類型中,float 和 short 極少使用。除非處理海量多維浮點數組且極度敏感記憶體,否則統一用 double(精度更高、運算更快)和 int(CPU 原生字長)。
C++ 中 private 限制同類不同實例互訪,需靠 getter。Java private 作用域是類級別:同類實例可直接訪問彼此私有字段。因此 equals() 中直接用 this.x == other.x 即可,混用字段與 getter 屬於多餘且易誤導。
int[] arr 而非 int arr[],強調「int 數組」類型整體性。s == null:Java 賦值表達式是 int,if (x = 7) 編譯報錯,無需 C 風格的 if (7 == x) 防呆。printf:"Errors: " + count 可讀性更強、類型安全、無格式化漏洞。i++ 為主流:無副作用場景下 80%+ Java 開發者偏好 i++,統一風格減少審查困惑。File.delete() 返回 boolean 是早期 API 遺留問題。正確設計:成功無返回,失敗拋 IOException。異常機制將錯誤處理從主流程剝離,支援跨層傳播至最合適處理點。
// 反模式:巢狀 try-catch 淹沒業務邏輯
public void readNumberFromFile(String name) {
try { in = new FileInputStream(name); }
catch (FileNotFoundException e) { ... return; }
try { reader = new InputStreamReader(in, "UTF-8"); }
catch (UnsupportedEncodingException e) { ... return; }
// ... 層層嵌套 ...
}
// 正統寫法:單一 try 區塊,catch 統一在尾部
public void readNumberFromFile(String name) {
try {
FileInputStream in = new FileInputStream(name);
InputStreamReader reader = new InputStreamReader(in, "UTF-8");
BufferedReader buffer = new BufferedReader(reader);
String line = buffer.readLine();
double x = Double.parseDouble(line);
System.out.println("Read: " + x);
}
catch (NumberFormatException e) { /* 處理格式錯誤 */ }
catch (IOException e) { /* 處理 IO 錯誤 */ }
}
底層工具方法(如 copy(InputStream, OutputStream))不應吞噬 IOException,而應聲明 throws IOException 交由調用方決策。這符合「異常由知情者處理」原則。
這些規範不直接提升運行速度,但能預防 Bug、降低維護成本、促進團隊協作。寫地道 Java 代碼,如同講標準普通話——不需天賦,只需刻意練習。當你不再思考風格細節,專注業務邏輯時,才算真正入門。