一、平臺無關性的支持
1、 Java平臺
Java平臺屏蔽了所有底層與硬件、操作系統的交互實現,java程序只需要知道java平臺提
供的API,但如果程序中調用本地方法就無法保證平臺無關性。
2、 java語言
java編程語言主要通過對基本的數據類型的值域和行爲都由語言定義,而跟具體的操作系統
無關。但在c或者c++中,像int型的值域是由它的佔位寬度決定,二佔位寬度又依賴於
編譯器所在的平臺,但java就規定int都是32爲二進制補碼標識的有符號證書,float則總
是遵收IEEE754浮點標準的32位浮點數。
3、 class 文件
Java class文件可以在任何平臺創建,它也可以被任意平臺的Java虛擬機裝入並運行,它的
格式都有嚴格的規定,並且是與java虛擬機所在的目標平臺無關。
4、 可伸縮性
Java提供了3套API:
企業版(J2EE)
標準版(J2SE)
微型版(J2ME)
在高端,企業版的存在表明了Java平臺的高端服務的可用性。在終端,標準版提供了在瀏
覽器中啓動傳統applet的功能和桌面環境下的Java平臺。在低端,微型版通過不同的行業
子集,顯示了Java平臺可以向下伸縮。
二、影響平臺無關性的因素
1、 Java平臺的部署:
決定java平臺無關性的最主要的因素就是Java平臺的不同平臺上被部署的程度。
2、 Java平臺的版本
Sun定義了企業版、標準版、微型版,在決定平臺無關性時需要考慮程序中使用了那一部分
的API,來決定應該部署java平臺的哪個版本。同時儘管虛擬機變化緩慢,但是Java API
是時刻變化着的,有些API特性隨着時間的推移可能已經不被支持,雖然大部分都是向
上兼容的,但不是絕對。所以在發佈版本的時候還需要決定哪個java版本適合自己的應用。
3、 本地方法
如果爲了性能或者系統某些特性javaapi沒有提供實現等情況,調用了本地方法,那麼應用
本身就不具備平臺無關的特性。
4、 非標準運行時庫
Java平臺可以有很多開發商來實現,都有可能提供另外的擴展庫,如果這些庫調用了本地方
法,而程序中又使用到了這些庫,也將失去平臺無關的特性。
5、 對虛擬機的依賴
以下兩條與虛擬機實現有關的原則在平臺無關性方面是必須遵守的:
(1) 不要依賴及時中介(finilization)來達到程序的正確性;
因爲所有的java虛擬機都必須有垃圾收集堆,但是不同的實現可能使用不同的垃圾收集技
術。在Java虛擬機規範中的這個靈活性意味着,在不同的虛擬機中,一個特定的java程序
中的對象可能在不同的時間被垃圾回收。如果使用了一箇中介方法來釋放有限的內存資源
等,程序就可能可以在一些虛擬機的實現上運行,而在其他實現上不能運行,因爲有可能在
垃圾收集器調用釋放資源之前,資源已經耗盡。
(2) 不要依賴線程的優先級來達到程序的正確性。
Java虛擬機規範只保證了在程序中所有擁有高優先級的可運行線程可以得到一些CPU時
間,在高優先級被阻塞的情況下,低優先級的線程也會運行。但是,在較高優先級的線程
沒有被阻塞的情況下,並沒有禁止低優先級的線程運行。因此,在一些虛擬機實現中就
可能出現較高優先級的進程在沒有被阻塞的情況下,低優先級的線程也可以得到CPU時間。
因此爲了保證多線程Java程序的平臺獨立,必須歷來同步而不是優先級來在線程之間協調
相互間的動作
6、 對用戶界面的依賴
AWT和Swing組建只保證了在平臺上用戶界面創建的容易性,但它們不一定使用戶界面設
計方便。
7、 Java平臺的BUG
雖然Sun開發了一套全面的測試標準,但也無法避免平臺實現的BUG,因此你只能通過測試來避免BUG,如果BUG影響到程序的運行,就應該想辦法繞過此BUG,找尋其他途徑。
8、 測試
因爲java平臺的實現之間可能存在差異,依賴某些特定平臺些的程序,以及在任何特定的
Java平臺的實現中都存在BUG,所以應該儘可能在在所有希望運行的平臺上對java程序
進行測試,就好比web前端開發人員要對所有IE、firefox、chrom、opera等做瀏覽器兼容
測試一樣。
三、平臺無關的7個步驟
1、選擇程序要運行的主機和設備的集合
2、在目標宿主機中選擇自認爲足夠好的Java平臺版本,在該平臺版本上編寫、運行程序
3、對於每個宿主機,選擇一些程序將要運行的java平臺實現(目標運行時環境)。
4、程序只訪問Java API的標準運行庫
5、不依賴於垃圾回收器和線程優先級來達到程序正確性目的
6、努力設計一個用戶界面,是它在所有目標宿主機上能正確運行
7、在所有的目標運行時環境和宿主機上進行程序測試