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

如果使用Sun专有的Java类,编译器将显示警告。 我认为使用这些类通常是一个糟糕的主意。 我读了这个地方。 但是,除了警告之外,你有什么根本的理由不应该使用它们?

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

尽量避免使用这样的API,总是喜欢公开的文档和指定的类。

JDK 6文档包含一个标题为“ 关于sun.*包 ”的链接。 这是来自Java 1.2文档的一个文档,所以对sun.*引用应该像对待com.sun.*一样对待com.sun.*

其中最重要的一点是:

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

每个实现Java平台的公司都将以自己的私人方式进行操作。 sun.*的类包含在SDK中以支持Java平台的Sun实现: sun.*类是Java平台类为Sun Java 2 SDK“覆盖”而工作的原因。 这些类通常不会出现在另一个供应商的Java平台上。 如果您的Java程序按名称要求类“sun.package.Foo”,则它可能会因ClassNotFoundError而失败,您将失去在Java中开发的一个主要优势。

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

(您的代码将失败,并带有ClassNotFoundexception)

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

所以你把你的代码和特殊的Java版本耦合起来,至less可以轻松移植。

Sun专有的Java类是其Java实现的一部分,而不是Java API的一部分,它们的使用没有logging,也不受支持。 由于它们是内部的,因此任何时候都可以根据Sun JVM工作组决定的原因进行更改。

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

这里是Oracle的答案: 为什么开发人员不应该编写叫做“太阳”包的程序

我最近遇到了一个案例,显示了在使用这些类时可能遇到的现实世界问题:我们的代码不能编译,因为在Ubuntu上的OpenJDK中没有使用sun。*类的方法。 所以我想在使用这些类的时候,你不能再说“这适用于Java 5”,因为它只能用于某个Java实现。