如果您使用 Sun 的专有 Java 类,编译器会显示警告。我认为使用这些类通常是个坏主意。我在某处读过这个。但是,除了警告之外,还有什么根本原因不应该使用它们吗?
7 回答
因为它们是内部 API:它们可能会以未记录或不受支持的方式进行更改,并且它们绑定到特定的 JRE/JDK(在您的情况下为Sun),从而限制了程序的可移植性。
尽量避免使用此类 API,总是更喜欢公共记录和指定的类。
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 开发的主要优势。
尝试使用非 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 实现。