轉載自:http://www.cnblogs.com/Y/archive/2011/03/22/JavaVM_Learning_Chapter2_Platform_Independence.html
為什么要平台無關?
廢話!當然是方便了,你隨手寫一個Hello,world!,地球上所有的設備都能顯示出來,那多牛B!寫hello,world! 你可能覺得沒有用,那要是寫一句“今年過節不收禮。。。”,錢是不是就開始掉下來了?
Java體系結構對平台(操作系統)無關的支持
這部分是本章中我最覺得有用的,如下:
- Java平台提供平台無關性。把臟活累活留給自己,打掉牙往肚里吞,對外始終保持一個樣(小樣?)。
- Java語言提供平台無關性。由於不需要針對特定操作系統,Java語言就只針對Java的平台,所以就不會出現大端小端的問題,不會出現int的占位長度問題等等。
- Java的class文件提供平台無關性。就是說,不僅語言提供無關性,把語言扁(編)過以后,還是無關。
- 可 伸縮性。如果把windows、linux、unix、mac等等看做是橫向的系統,在這些系統上Java可以提供相同的功能。那么大型機、小型機、微型 機、嵌入式設備就是縱向的,Java通過對自身平台的擴展或者縮減來提供不同規模和功能的系統。相當於windows的桌面平台、服務器平台和嵌入式平台 (Windows CE/Mobile)。
其實,一二三點都是基 於Java平台本身無關帶來的,就是從源代碼->中間文件->實現功能 這三級都通通統一(拗口吧)。這個思想應該值得我們在設計平台時借鑒,在設計一個業務平台時,考慮分層(類似 實現/功能/中間文件/代碼)時,盡量提供可擴展和可伸縮的設計,讓后期的功能改變都只影響盡量少的模塊(這句話我寫是寫了,但是感覺有些空,就權當是耳 邊風吧,反正又不收錢)。
另外,從第四點中,我倒是稍微搞清楚了不同類型Java平台的作用了。J2EE、J2SE、J2ME分別針對企業應用、桌面應用和移動應用。微軟有分移動平台和桌面平台,但是好像沒有把企業應用單獨分出來。
影響平台無關的因素
這一部分的意思主要就是:其實Java也不是真的就能把所有的系統全部都吃進去,由於有如下因素:
- Java平台的部署。就是指這個系統中是否支持Java。這個真的是廢話了,如果不支持,Java平台的本地實現從天上掉下來?
- Java平台的版本。一個是指企業/桌面/移動的不同版本,一個是指平台的版本號變遷。這兩個都好理解,前一個是范圍的問題,后一個是版本前后兼容的問題。
- 本 地方法。想平台無關,就不要用本地方法。但是一定要用怎么辦?一個是就不要追求平台無關了,這個做法是最常見的,用於兼容老的、特定的軟硬件系統,或者根 本就沒有跨平台的需要。另外一個是在所有的系統中都加上本地方法,把本地方法融入到你自己的Java平台中,讓它變成YourJava平台的一部分,當然 了,代價就是你要去做原來Sun/Oracle做的事情。
- 非標准運行時 庫。我真是天才,上面一點中我就想到了把自己的方法變成YourJava平台的一部分,這里馬上就提到了很多廠商就提供了自己的庫。廠商一般需要先提供標 准的Java運行時庫,然后提供擴展的功能,提供N多系統對應的CompanyJava平台版本,越是NB的廠商,其功能就越強大,支持的系統就越廣泛 (MS例外)。
- 對虛擬機的依賴。finalization和thread prioritization這兩個功能可能會因為不同開發商實現的不同導致平台依賴性,所以,不要用這兩個特性。這個說法我以前沒有接觸到,所以理解可能有問題,以后想通了再回來補充一下。
- 對 界面的依賴。這個簡單,打開一個軟件,你一眼就能發現:這個是windows軟件,這個是蘋果上面的,這個是Java的,這個是Dos的,不同的操作系統 都有自己的典型界面,用戶可能習慣於這個界面,所以理論上,Java軟件具有統一界面且不與系統相關,剛開始的時候, 誰都看它不順眼(因為和誰都不一樣唄!)這個貌似現在有做法是做成界面本地系統化,讓不同系統上的Java調用該系統對應的界面,以達到欺騙用戶雙眼和蒙 蔽用戶心靈的雙重功效。
- Bug。不懂,誰都有Bug,這個影響什么?
- 測試。不測試好所有的系統就無法說全系統平台無關。實際使用中,把能涉及到的系統都測試一下就OK了,不可能做個qq還要求神馬也支持。
如何做到平台無關
考慮如下因素:
- 選對象-軟件要運行在哪些軟硬件系統上?
- 選平台-Java平台和版本,如寫手機軟件用J2EE,寫QQ for iPad用J2SE的win7版本,做網站用J2ME,這些都是找死的做法,千萬不要哦。另外,版本號也是非常重要,對於新老系統的兼容性也需要考慮。
- 選運行時-平台規平台,實現歸實現,選微軟的和IBM的就是不一樣的,這個也需要好好考慮,一旦確定后,通常是不好變的,小變可以,大變比較困難。
- 只用改用的-只用標准的,本地的、廠商特有的,通通不用!這個有時候比較難,要不然為什么我選那個廠商呢?
- 不依賴虛擬機-這個我不熟悉,參看上面“影響平台無關的因素”中的第五點。
- 做一個界面-這個我不懂,意思是說,做一個界面,這個界面在所有的系統上都能正常工作,是說不讓用特別的控件或實現方式嗎?。
- 測試-就是所有系統都測試一下,不要只測試一個,就覺得其它的都沒有問題了。看吧,Java也不是真的就只在一個操作系統上搞定,就能搞定所有的了,平台無關還是一個相對的概念。
如果你都做到了,也不一定就行,反正最終是以實際結果為准,如果結果也都OK,你就能用一個咖啡的標記表示純正的麥斯威爾,不對,是Java。
平台無關性的策略
有 一些廠商提供了Java的運行時庫,增加了自己的功能,提供了一些獨有的工具,你需要作出選擇,到底用誰的。我現在的水平和money觀念還顧不上這么 多,搞不好一天換3套平台都是有可能的,一般是聽有經驗的同事或者上網看看別人的評價(可惜不如淘寶的方便和真實),然后作出一個決定就行了。如果錯了怎 么辦?涼拌!換一個不就得了。
心得
沒有想到這么一章我不是很感興趣的章節還打了這么多字,我是不是很久沒有打字了?
說實話,這一章主要是比較系統性的理順了我之前對Java的宏觀理解,包括企業/桌面/移動的分類,Java是需要在不同系統上專門實現的,企業可以基於Java平台的標准,自己提供實現。還是有收獲的,不然真不會寫這么多!