使用Sun专有的Java类是不好的做法?

It is a bad practice to use Sun's proprietary Java classes?

编译器显示警告如果你使用太阳的所有权Java等级。我认为,一般来说,使用这些班级是一个坏主意。我在哪里读到的但是,在温暖中,有什么根本原因你不应该使用它们?


因为它们是内部API:它们会以未记录或不受支持的方式进行更改,并且它们绑定到特定的JRE/JDK(在您的情况下是Sun),从而限制了程序的可移植性。

尽量避免使用这样的API,总是倾向于使用公共文档和指定的类。


JDK6文档包含一个链接,标题为关于sun.*包的说明。这是一个来自Java 1.2文档的文档,所以对EDCOX1(0)的引用应该被看作是说EDCOX1 2。

其中最重要的一点是:

The classes that Sun includes with the
Java 2 SDK, Standard Edition, fall
into package groups java.*, javax.*,
org.* and sun.*. All but the sun.*
packages are a standard part of the
Java platform and will be supported
into the future. In general, packages
such as sun.*, that are outside of the
Java platform, can be different across
OS platforms (Solaris, Windows, Linux,
Macintosh, etc.) and can change at any
time without notice with SDK versions
(1.2, 1.2.1, 1.2.3, etc). Programs
that contain direct calls to the sun.*
packages are not 100% Pure Java.

Each company that implements the Java
platform will do so in their own
private way. The classes in sun.* are
present in the SDK to support the Sun
implementation of the Java platform:
the sun.* classes are what make the
Java platform classes work"under the
covers" for the Sun Java 2 SDK. These
classes will not in general be present
on another vendor's Java platform. If
your Java program asks for a class
"sun.package.Foo" by name, it may fail
with ClassNotFoundError, and you will
have lost a major advantage of
developing in Java.


尝试使用非Sun JVM运行代码,看看会发生什么…

(您的代码将失败,并出现ClassNotFound异常)


是的,因为没有人保证这些类或API与下一个Java发行版是相同的,我敢打赌,不能保证这些类在其他供应商的Java版本中是可用的。

因此,您的代码与特殊Java版本相匹配,并且至少具有可移植性。


Sun的专有Java类是Java实现的一部分,而不是Java API的一部分,它们的使用是无文档的和不支持的。因为它们是内部的,所以可以在任何时候根据工作于Sun JVM的团队决定的任何原因进行更改。

另外,Sun的Java实现并不是唯一的一个!您的代码将无法从其他供应商(如Oracle/BEA和IBM)移植到JVM。


下面是Oracle的答案:为什么开发人员不应该编写调用"sun"包的程序


我最近有一个案例显示,当你使用这些类时,你会遇到一个现实世界的问题:我们有一些代码因为它在Sun上使用的方法而无法编译。*类在Ubuntu上的openjdk中根本不存在。所以,当使用这些类时,你不能再说"这是用Java 5来工作的",因为它只适用于特定的Java实现。