編寫跨平台Java程式注意事項
使用Java語言編寫應用程式最大的優點在於“一次編譯,處處運行”,然而這並不是 說所有的Java程式都具有跨平台的特性,事實上,相當一部分的Java程式是不能在別的作業系統上正確啟動並執行,那麼如何才能編寫一個真正的跨平台的 Java程式呢?下面是在編寫跨平台的Java程式是需要注意的一些事情:
1. 編寫Java跨平台應用程式時,你可以選擇JDK1.0,1.1,1.2或支援它們的GUI開發工具如:Jbuilder,Visual Age for Java 等等,但是必須注意你的Java程式只能使用Java核心API包,如果要使用第三方的類庫包,則該類庫包也要由Java核心包開發完成,否則在發布你的 程式的時候還得將支援該Java類庫包的JVM發布出去。也就是說,你的程式需要是100%純Java的。舉一個例子,Visual J++ 就不是純Java的,由Visual J++編寫的程式也就不具有平台無關性。
2. 無論你使用的是JDK或其他開發工具,在編譯時間都要開啟所有的警告選項,這樣編譯器可以儘可能多的發現平台相關的語句,並給出警告。雖然不能保證沒有編譯時間警告錯誤的程式一定是跨平台的,但含有警告錯誤的程式卻很有可能是非平台無關的。
3. 在程式中使用任何一個方法的時候,要詳細察看文檔,確保你使用的方法不是在文檔中已經申明為過時的方法(Deprecated method),也不是文檔中未標明的隱含方法(Undocumented method)。
4. 退出Java程式時盡量不要使用java.lang.System的exit方法。Exit 方法可以終止JVM,從而終止程式,但如果同時運行了另一個Java程式,使用exit方法就會讓該程式也關閉,這顯然不是我們希望看到的情況。事實上要 退出Java程式,可以使用destory()退出一個獨立啟動並執行過程。對於多線程程式,必須要關閉各個非守護線程。只有在程式非正常退出時,才使用 exit方法退出程式。
5. 避免使用本地方法和本地代碼,儘可能自己編寫具有相應功能的Java類,改寫該方法。如果一定要使用該本地方法,可以編寫一個伺服器程式調用該方法,然後將現在要編寫的程式作為該伺服器程式的客戶程式,或者考慮CORBA(公用對象請求代理)程式結構。
6. Java中有一個類似於Delphi中的winexec的方法,java.lang.runtime類的exec方法,作為該方法本身是具有平台無關性 的,但是給方法所調用的命令及命令參數卻是與平台相關的,因此,在編寫程式時要避免使用,如果一定要調用其他的程式的話,必須要讓使用者自己來設定該命令及 其參數。比如說,在windows中可以調用notepad.exe程式,在linux 中就要調用vi程式了。
7. 程式設計中的所有的資訊都要使用ASCII碼字元集,因為並不是所有的作業系統都支援Unicode字元集,這對於跨平台的Java中文軟體程式不能不說是一大噩耗。
8. 在程式中不要硬性編碼與平台相關的任何常量,比如行分隔字元,檔案分隔字元,路徑分隔字元等等,這些常量在不同的平台上是不同的,比如檔案分隔字元,在UNIX和 MAC中是“/”,在windows中是“/”,如果要使用這些常量,需要使用jdava.util.Properties類的getProperty方 法,如java.util.Properties.getProperty(“file.separator”)可以獲得檔案分隔字元, getProperty (“line.separator”)返回行分隔字元,getProperty(“path.separator”)返迴路徑分隔字元。
9. 在編寫跨平台的網路程式時,不要使用java.net.InetAddress類的getHostName方法得到主機名稱,因為不同的平台的主機名稱格式是 不同的,最好使用getAddress得到格式相同的IP地址,另外,程式中所有的主機名稱都要換成IP地址,比如www.263.net就要換成相應的 IP地址。
10. 涉及檔案操作的程式需要注意:不要在程式中硬性編碼檔案路徑,理由和8中一樣,只是這一點特別重要,因此單獨提出。而且,不同平台對於檔案名稱使用的字元及 最大檔案名稱長度的要求不同,編寫你的程式的時候要使用一般的ASCII碼字元作為檔案的名字,而且不能與平台中已存在的程式同名,否則會造成衝突。
11. 如果您寫的程式是GUI程式,在使用AWT組件時不能硬性設定組件的大小和位置而應該使用Java的布局管理器(layout manager)來設定和管理可視組件的大小和位置,否則有可能造成布局混亂。
12. 由於不同的作業系統,不同的機器,系統支援的顏色和螢幕的大小和解析度都不同,如何獲得這些屬性呢?使用java.awt.Systemcolor類可以 獲得需要的顏色,如該類的inactiveCaption 就是視窗邊框中活動標題的背景顏色,menu則是菜單的背景顏色。使用java.awt.Toolkit的getScreenResolution可以以 “象素每英寸”為單位顯示螢幕的解析度。該類的getScreenSize可以得到螢幕大小(英寸),loadSystemColors可以列出所有的系 統顏色。