Java 「一次編譯,處處運行」的承諾並非自動兌現。相當一部分 Java 程式因忽視平台差異而無法跨平台運行。以下十二條規則助你編寫真正可移植的 100% Pure Java 程式。
避免依賴特定廠商擴展(如 Visual J++ 專有類庫)。發布時若依賴非標準庫,需附帶對應 JVM,違背跨平台初衷。
javac -Xlint 或 IDE 相應設置。警告往往暴露平台相關代碼,無警告不保證跨平台,但有警告大概率存在移植隱患。
查閱官方 Javadoc,確認方法未標註過時、非內部實現細節(如 sun.*、com.sun.* 套件)。
System.exit() 會終止整個 JVM,若同一進程運行多個應用(如應用服務器部署多個 Webapp)會殃及無辜。正常退出應:
main()。exit()。優先用 Pure Java 重寫。若必須用,隔離為獨立服務(RMI、CORBA、REST),主程式作客戶端調用。
exec() 本身跨平台,但命令參數強綁定 OS(Windows notepad.exe vs Linux vi)。若必須調用外部程式,交由用戶配置命令路徑參數。
早期某些平台對 Unicode 支持不全。資源檔、屬性檔採用 native2ascii 轉義或 UTF-8 存儲。
使用 System.getProperty() 動態獲取:
file.separator:/ (Unix) / \ (Windows)path.separator:: (Unix) / ; (Windows)line.separator:\n / \r\n / \r主機名格式跨平台不一致。getAddress() 返回標準 IP 字節陣列。配置檔、代碼中統一使用 IP 或可解析的域名。
路徑由用戶配置或相對路徑構建。檔案名僅用 ASCII 字符,避免與系統保留名衝突(如 Windows CON, PRN, NUL 等)。
AWT/Swing 組件大小/位置隨平台字體、DPI、Look&Feel 變化。FlowLayout、BorderLayout、GridBagLayout 等佈局管理器自動適配。
java.awt.SystemColor(如 window, menu, textHighlight)。Toolkit.getDefaultToolkit().getScreenResolution() (DPI)。Toolkit.getDefaultToolkit().getScreenSize()。