28

如果您使用 Sun 的专有 Java 类,编译器会显示警告。我认为使用这些类通常是个坏主意。我在某处读过这个。但是,除了警告之外,还有什么根本原因不应该使用它们吗?

4

7 回答 7

58

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

尽量避免使用此类 API,总是更喜欢公共记录和指定的类。

于 2009-12-02T18:24:38.050 回答
24

JDK 6 文档包含一个标题为Note About sun.*Packages的链接。这是来自 Java 1.2 文档的文档,因此sun.*应将对的引用视为他们所说的com.sun.*

其中最重要的几点是:

Sun 包含在 Java 2 SDK 标准版中的类属于包组java.*javax.*和 。除了包之外的所有 包都是 Java 平台的标准部分,并且将在未来得到支持。一般来说,Java 平台之外的软件包(如 )在不同的操作系统平台(Solaris、Windows、Linux、Macintosh 等)之间可能会有所不同,并且可以随时更改 SDK 版本(1.2、1.2.1),恕不另行通知, 1.2.3 等)。包含对 包的直接调用的程序不是 100% 纯 Java。org.*sun.*sun.*sun.*sun.*

每家实现 Java 平台的公司都将以自己的私有方式进行。SDK 中的类sun.*支持 Java 平台的 Sun 实现:这些sun.*类使 Java 平台类在 Sun Java 2 SDK 的“幕后”工作。这些类通常不会出现在其他供应商的 Java 平台上。如果您的 Java 程序按名称请求类“sun.package.Foo”,它可能会因 ClassNotFoundError 而失败,您将失去使用 Java 开发的主要优势。

于 2009-12-02T20:43:49.313 回答
10

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

(您的代码将因 ClassNotFound 异常而失败)

于 2009-12-02T20:18:01.910 回答
7

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

因此,您将您的代码与特殊的 Java 版本结合起来,并且至少失去了可移植性。

于 2009-12-02T18:25:47.690 回答
4

Sun 的专有 Java 类是其 Java 实现的一部分,而不是 Java API 的一部分,它们的使用未记录且不受支持。由于它们是内部的,因此可以根据 Sun JVM 团队决定的任何原因随时更改它们。

Sun 的 Java 实现也不是唯一的!您的代码将无法移植到 Oracle/BEA 和 IBM 等其他供应商的 JVM。

于 2009-12-02T18:36:02.567 回答
2

这是 Oracle 的回答:为什么开发人员不应该编写调用“sun”包的程序

于 2012-06-05T09:28:47.577 回答
1

我最近有一个案例展示了使用这些类时可能遇到的实际问题:我们的代码无法编译,因为它在 sun.* 上使用的方法在 Ubuntu 上的 OpenJDK 中根本不存在。所以我想在使用这些类时,你不能再说“这适用于 Java 5”之类的话,因为它只适用于特定的 Java 实现。

于 2009-12-02T20:35:36.147 回答