为何程序员不该调用“sun”包?

J2SE API Documents是咱们最经常使用的参考手册,但细心的朋友可能会发现,在“%JAVA_HOME%\jre\lib\rt.jar”中包含比API文档更多的类,那么其它的类为何没有在帮助文档中出现呢?在SUN的JDK FAQ中有一篇“Why Developers Should Not Write Programs That Call 'sun' Packages”,该文部分地解答了这个问题,我将原文翻译以下 ================================================================================ J2SE中的类大体能够划分为如下的各个包: java.*,javax.*,org.*,sun.* 除了“sun”包,其它各个包都是Java平台的标准实现,而且从此也将被继续支持。通常说来,“sun”之类的包并不包含在Java平台的标准中,它与操做系统相关,在不一样的操做系统(如Solaris,Windows,Linux,Mac等等)中的实现也各不相同,而且可能随着J2SE版本不按期变化。所以,直接调用“sun”包的程序代码并非100%的Java实现。也就是说: “java.*”包,“javax.*”包,“org.*” 包是做为J2SE的API公开接口的一部分,若是程序直接调用这些包中的API,那么程序是能够运行在全部Java平台上,而与操做系统无关;但 “sun.*”包并非API公开接口的一部分,调用“sun”包的程序并不能确保工做在全部Java平台上,事实上,这样的程序并不能工做在从此的 Java平台上。 正由于如此,“sun.*”包中的类并无提供API文档。平台无关性是Java语言最大的优点之一,此外,SUN和 Java许可证确保维持了从此API的向上兼容性(之后修改的那些有严重bug的代码除外)。这种兼容性意味着你写好的程序编译成的cl ass文件仍然能够工做在未来的版本当中。 每家实现Java平台的厂商均可以使用他们本身的方式。“sun.*”包中的类是SUN 对Java平台的实现方式,它们工做在Java 2 SDK的下层,这些类未必被其它Java 平台开发商支持。好比你的Java程序若是调用了一个名为 “sun.package.Foo”的类,将有可能产生“ClassNotFoundError”的错误,同时你也将失去利用Java的一个主要的优势。 从技术上讲,并不能防止你的程序调用“sun.*”包中的类。在版本的变迁当中,这些类可能会被删除或转移到其它包路径下,并且它的接口(包括名称、标签等)也颇有可能发生变化,(根据SUN的观点,咱们应当可以经过对“sun.*”包的修改来提升Java平台的性能。)在这种状况下,即使你但愿程序仅仅运行在SUN的实现平台下,你仍将承受新的版本给你的系统带来破坏的风险。总之,编写依赖于“sun.*”包的Java程序是不安全的,他们将变得没法移植,没法被很好地支持。
相关文章
相关标签/搜索