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

问题描述 投票:0回答:8

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

java sun
8个回答
60
投票

因为它们是内部 API:它们可能会以“未记录”或“不受支持”的方式进行更改,并且它们绑定到特定的 JRE/JDK(在您的情况下是“Sun”),从而限制了程序的可移植性。 尽量避免使用此类 API,始终首选公共记录和指定的类。

JDK 6 文档

包含一个标题为

关于

24
投票

的链接。 这是 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 中以支持 Sun Java平台的实现:

sun.*

类使得 Java 平台类工作在“ 适用于 Sun Java 2 SDK 的“涵盖”。这些 一般情况下不会出现课程 在另一个供应商的 Java 平台上。如果 你的 Java 程序需要一个类 名称为“sun.package.Foo”,可能会失败 与 ClassNotFoundError ,你会 失去了主要优势 使用 Java 开发。


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

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

10
投票

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

因此,您将代码耦合到特殊的 Java 版本,并至少失去了可移植性。


7
投票

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

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


4
投票

这是 Oracle 的答案:

为什么开发人员不应该编写调用“sun”包的程序


2
投票

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


1
投票
com.sun.net.httpserver.*

类系列,用于创建小型嵌入式

http(s)

0
投票


© www.soinside.com 2019 - 2024. All rights reserved.