使用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实现。