jungleford如是說
J2SE API Documents是我們最常用的參考手冊,但細(xì)心的朋友可能會發(fā)現(xiàn),在“%JAVA_HOME%\jre\lib\rt.jar”中包含比API文檔更多的類,那么其它的類為什么沒有在幫助文檔中出現(xiàn)呢?在SUN的JDK FAQ中有一篇“Why Developers Should Not Write Programs That Call 'sun' Packages”,該文部分地解答了這個問題,我將原文翻譯如下
=====================================================================
J2SE中的類大致可以劃分為以下的各個包:
java.*,javax.*,org.*,sun.*
除了“sun”包,其它各個包都是Java平臺的標(biāo)準(zhǔn)實現(xiàn),并且今后也將被繼續(xù)支持。一般說來,“sun”之類的包并不包含在Java平臺的標(biāo)準(zhǔn)中,它與操作系統(tǒng)相關(guān),在不同的操作系統(tǒng)(如Solaris,Windows,Linux,Mac等等)中的實現(xiàn)也各不相同,并且可能隨著J2SE版本不定期變化。因此,直接調(diào)用“sun”包的程序代碼并不是100%的Java實現(xiàn)。也就是說:
“java.*”包,“javax.*”包,“org.*”包是作為J2SE的API公開接口的一部分,如果程序直接調(diào)用這些包中的API,那么程序是可以運行在所有Java平臺上,而與操作系統(tǒng)無關(guān);但“sun.*”包并不是API公開接口的一部分,調(diào)用“sun”包的程序并不能確保工作在所有Java平臺上,事實上,這樣的程序并不能工作在今后的Java平臺上。
正因為如此,“sun.*”包中的類并沒有提供API文檔。平臺無關(guān)性是Java語言最大的優(yōu)勢之一,此外,SUN和Java許可證確保維持了今后API的向上兼容性(以后修改的那些有嚴(yán)重bug的代碼除外)。這種兼容性意味著你寫好的程序編譯成的cl ass文件仍然可以工作在將來的版本當(dāng)中。
每家實現(xiàn)Java平臺的廠商都可以使用他們自己的方式?!皊un.*”包中的類是SUN 對Java平臺的實現(xiàn)方式,它們工作在Java 2 SDK的下層,這些類未必被其它Java 平臺開發(fā)商支持。比如你的Java程序如果調(diào)用了一個名為“sun.package.Foo”的類,將有可能產(chǎn)生“ClassNotFoundError”的錯誤,同時你也將失去利用Java的一個主要的優(yōu)點。
從技術(shù)上講,并不能防止你的程序調(diào)用“sun.*”包中的類。在版本的變遷當(dāng)中,這些類可能會被刪除或轉(zhuǎn)移到其它包路徑下,而且它的接口(包括名稱、標(biāo)簽等)也很有可能發(fā)生變化,(根據(jù)SUN的觀點,我們應(yīng)當(dāng)能夠通過對“sun.*”包的修改來提高Java平臺的性能。)在這種情況下,即便你希望程序僅僅運行在SUN的實現(xiàn)平臺下,你仍將承受新的版本給你的系統(tǒng)帶來破壞的風(fēng)險??傊?,編寫依賴于“sun.*”包的Java程序是不安全的,他們將變得無法移植,無法被很好地支持。