如果您使用 Sun 的专有 Java 类,编译器会显示警告。我认为通常不应该使用这些类。我在某个地方读到过这个观点。但是,除了出现警告之外,还有其他基本原因导致您不应该使用它们吗?
如果您使用 Sun 的专有 Java 类,编译器会显示警告。我认为通常不应该使用这些类。我在某个地方读到过这个观点。但是,除了出现警告之外,还有其他基本原因导致您不应该使用它们吗?
因为它们是内部API:它们可能以未记录或不支持的方式发生变化,并且它们绑定到特定的JRE / JDK(在您的情况下为Sun),限制了您程序的可移植性。
尽量避免使用这些API,始终优先选择公共记录和指定的类。
com.sun.*
下的一些 API 是实验性的(例如原始 APT API)。如果我没记错的话,Alex Buckley 在他的博客中介绍了这些 API 的各种状态。但总的来说,在更新版本和不同的供应商之间,它们可能会发生更改或消失。 - Tom Hawtin - tacklineapt
,现在是 javac
的一部分(-processor
等)。 - Tom Hawtin - tacklineJDK 6文档中包含一个名为Note About sun.*
Packages的链接。这是来自Java 1.2文档的一份文件,因此对sun.*
的引用应视为对com.sun.*
的引用。
其中最重要的几点是:
Sun随Java 2 SDK、标准版一起提供的类属于包组
java.*
、javax.*
、org.*
和sun.*
。除了sun.*
包外,其他所有包都是Java平台的标准部分,并且将得到支持。通常,诸如sun.*
之类的在Java平台之外的包可能会因为操作系统平台(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开发的主要优势。com.sun.*
不会变成 com.oracle.*
,因为 Sun 公司已经不存在了。 - Powerlordcom.sun.*
包是文件化规范的一部分。没有它们将无法编写JNDI LDAP或COSNaming代码。问题在于sun.*
包,这是一个完全不同的问题,并且有明确的文档说明。 - user207421sun.*
和com.sun.*
类将会失败得非常惊人。 - Powerlordcom.sun.*
类。它们是Sun/Oracle JDK的已记录部分。 - user207421sun.*
是内部的,但是有没有关于 com.sun.*
是内部的任何来源?并且有没有任何版本中 com.sun.*
包出现问题的例子? - Franklin Yu尝试使用非Sun JVM运行你的代码,看看会发生什么...
(你的代码将因为ClassNotFound异常而失败)
是的,因为没有人能保证这些类或API在下一个Java版本中仍然保持不变,我敢打赌这些类在其他供应商的Java版本中也可能不可用。
所以你把你的代码与特定的Java版本联系起来,至少会失去可移植性。
Sun公司的专有Java类是他们的Java实现的一部分,而不是Java API的一部分,它们的使用未经记录和不受支持。由于它们是内部的,因此Sun JVM团队随时可以出于任何原因更改它们。
此外,Sun的Java实现并不是唯一的!您的代码将无法在其他供应商(如Oracle/BEA和IBM)的JVM上移植。