为什么 Cloneable 没有被弃用?

2023-12-22

人们普遍认为CloneableJava 中的接口已损坏。造成这种情况的原因有很多,我就不一一列举了;others http://howtodoinjava.com/2012/11/10/cloneable-interface-is-broken-in-java/已经做了。这也是Java架构师 http://www.artima.com/intv/bloch13.html他们自己。

因此,我的问题是:为什么还没有被弃用?如果核心 Java 团队认为它已被破坏,那么他们也必须考虑过弃用。他们反对这样做的理由是什么(在 Java 8 中是仍未弃用 http://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.html)?


有一个bug http://bugs.java.com/bugdatabase/view_bug.do?bug_id=40980331997年提交给Java 错误数据库 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4098033关于添加clone()方法Cloneable,这样它就不再是无用的了。它以“不会修复”的决议结束,理由如下:

Sun 的技术审查委员会 (TRC) 详细考虑了这个问题 并建议不要服用除了改进以外的任何行动 当前 Cloneable 接口的文档。这是完整的 建议案文:

现有的 Java 对象克隆 API 存在问题。有一个 java.lang.Object 上受保护的“克隆”方法并且有一个接口 java.lang.Cloneable。目的是如果一个类想要允许 其他人克隆它,那么它应该支持 Cloneable 接口并覆盖默认的受保护克隆方法 公共克隆方法。不幸的是,由于各种原因很容易迷失在 时间的长河中,Cloneable接口并没有定义克隆 方法。

这种组合会导致相当多的混乱。部分课程 声称支持Cloneable,却一不小心忘记支持 克隆方法。开发人员对 Cloneable 的含义感到困惑 工作以及克隆应该做什么。

不幸的是,向 Cloneable 添加“克隆”方法将是一个 不相容的改变。它不会破坏二进制兼容性,但会 破坏源兼容性。轶事证据表明,在 实践中,有许多案例支持课程 可克隆接口,但无法提供公共克隆方法。后 经过讨论,TRC 一致建议我们不要修改 现有的Cloneable接口,因为兼容性影响。

另一种建议是添加一个新界面 java.lang.PubliclyCloneable 反映最初的预期目的 可克隆的。 TRC 以 5 比 2 的多数反对这一决定。 主要担心的是这会增加更多混乱(包括 拼写混乱!)到一张已经混乱的图片。

TRC 一致建议我们应该增加额外的 现有 Cloneable 接口的文档为了更好地描述 如何使用它并描述“最佳实践” 实施者。

所以,虽然这不是直接关于已弃用,不让 Cloneable “弃用”的原因是技术审查委员会决定修改现有文档就足够了使这个界面有用。他们也确实这么做了。直到Java 1.4,Cloneable记录如下:

一个类实现了 Cloneable 接口来指示 Object.clone() 方法,该方法创建一个对象是合法的 该类实例的逐字段副本。

尝试克隆未实现 Cloneable 的实例 接口导致异常 CloneNotSupportedException 抛出。

Cloneable 接口没有声明任何方法。

从 Java 1.4(2002 年 2 月发布)到当前版本(Java 8),它看起来像这样:

一个类实现了 Cloneable 接口来指示 Object.clone() 方法,该方法创建一个对象是合法的 该类实例的逐字段副本。调用对象的 未实现 Cloneable 的实例上的克隆方法 接口导致异常 CloneNotSupportedException 抛出。

按照惯例,实现此接口的类应该重写 使用公共方法的 Object.clone(受保护)。看 Object.clone() 了解有关重写此方法的详细信息。

请注意,该接口不包含clone方法。所以, 仅凭以下事实不可能克隆对象 它实现了这个接口。即使调用了clone方法 仔细想想,并不能保证它会成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Cloneable 没有被弃用? 的相关文章

  • Java Swing 应用程序消息对话框帮助

    我正在开发 Java Swing 应用程序 我需要创建一个如图所示的对话框 我不知道这个的名字 我无法解释 所以我附上一张照片 请告诉我这叫什么以及如何在我的 GUI 应用程序中创建它 给猫剥皮的方法不止一种 public final cl
  • 我在使用 JavaFX 绘制十字时遇到问题

    我正在尝试编写代码 在网格上对角绘制 3 个形状 前两个形状是正方形和圆形 我能做到 然而 第三种形状让我有些悲伤 我应该画一个十字 T 版本 而不是 X 每次我写出代码时 它看起来就像一个侧面 我知道我只是错过了一些简单的东西 但我真的很
  • Android:对于具有 LinearLayout 定义的成员的 ListView,上下文菜单不显示?

    我有一个 ListActivity 和 ListView 并且我已将一些数据绑定到它 数据显示得很好 而且我还为视图注册了一个上下文菜单 当我将列表项显示为简单的 TextView 时 它工作正常
  • 从另一个进程捕获 system.out 消息

    我有一个 JVM 1 它启动 JVM 2 我希望能够在 JVM 1 中监视来自 JVM 2 的 System out println 调用 直接的方法是 JVM A 执行系统命令来启动 JVM B 然后 JVM A 读取 B 的所有输出 S
  • 查找所有数组的长度多维数组,Java

    我想使用多维数组来存储数据网格 但是 我还没有找到一种简单的方法来查找长度2nd数组的一部分 例如 boolean array new boolean 3 5 System out println array length 只会输出3 是否
  • org.openqa.selenium.NoSuchSessionException:会话 ID 为空。调用 quit() 后使用 WebDriver?

    我已经进行了一些搜索 但仍然遇到同样的问题 我相信这可能是由于我的网络驱动程序是静态的造成的 我不太确定 在我的主课中 我包括了 BeforeTest and AfterTest BeforeTest包括根据我的 XML 文件启动新浏览器
  • Java - 调整图像大小而不损失质量

    我有 10 000 张照片需要调整大小 因此我有一个 Java 程序来执行此操作 不幸的是 图像的质量损失很大 而且我无法访问未压缩的图像 import java awt Graphics import java awt AlphaComp
  • Eclipse Oxygen - 该项目未构建,因为其构建路径不完整

    我刚刚安装了 Eclipse Oxygen 并尝试在工作台中打开现有项目 但收到此错误 该项目未构建 因为其构建路径不完整 不能 找到 java lang Object 的类文件 修复构建路径然后尝试 建设这个项目 我尝试右键单击该项目 转
  • SSLContext 初始化

    我正在看JSSE参考指南 我需要获取一个实例SSLContext为了创建一个SSLEngine 所以我可以使用它Netty以启用安全性 获取实例SSLContext I use SSLContext getInstance 我看到该方法被重
  • 合并和颜色样式不适用于 Apache POI excel 2003 格式

    在 Apache POI 中 我为某些单元格应用了一些样式并合并了这些单元格 当我在 2010 年或 2007 年打开时 它工作正常 但在 2003 年 格式样式消失了 每次保存 2003 Excel 文件之前都会弹出兼容性检查对话框 请参
  • IntelliJ - 无效源版本:17

    我已经在 IntelliJ 中使用 Gradle 创建了一个使用 Java 17 的新 Java 项目 运行我的应用程序时出现错误Cause error invalid source release 17 我的设置 我已经安装了openjd
  • 为什么replaceAll在这行代码中不起作用? [复制]

    这个问题在这里已经有答案了 String weatherLocation weatherLoc 1 toString weatherLocation replaceAll how weatherLocation replaceAll wea
  • gwt 文本框添加更改处理程序

    我有一个从设计师那里收到的文本框 但是我在 GWT 中编写了操作 问题是文本框为空 但是当通过按下按钮用值填充文本框时 将显示警报框 通知值已更改 但没有成功 帮助我 TextBox zip1 null function onModuleL
  • Web 服务客户端的 AXIS 与 JAX-WS

    我决定用Java 实现Web 服务客户端 我已经在 Eclipse 中生成了 Axis 客户端 并使用 wsimport 生成了 JAS WS 客户端 两种解决方案都有效 现在我必须选择一种来继续 在选择其中之一之前我应该 考虑什么 JAX
  • 将一个整数从 C 客户端发送到 Java 服务器

    我使用此代码将一个整数从我的 Java 客户端发送到我的 Java 服务器 int n rand nextInt 50 1 DataOutputStream dos new DataOutputStream socket getOutput
  • 如何在 Hibernate 中自动递增复合主键中的 Id?

    我有一个带有复合主键的表 groupId and batchId 实体类看起来像 Entity name EMPLOYEE public class Employee EmbeddedId private EmployeePK employ
  • 空检查时可能未初始化错误

    我正在检查变量是否已初始化 但此时 netbeans 给了我variable reader might not have been initialized警告 我该如何解决 抑制这个问题 这是我的代码 摘要 final Reader rea
  • Android Webview:无法调用确定的可见性() - 从未见过 pid 的连接

    我有一个 Android Webview 当我单击链接下载文件 pdf 图像等 时 我收到一条错误消息 Error message Cannot call determinedVisibility never saw a connectio
  • Volley 在第一次调用方法时返回 null

    我正在尝试使用 volley 从服务器检索数据 但是当我第一次调用此方法时 我收到服务器的响应 但该方法返回 null 如果我第二次调用它 我会得到最后的响应 public String retrieveDataFromServer Str
  • 需要在没有wsdl的情况下调用soap ws

    我是网络服务的新手 这个网络服务是由 siebel 提供的 我需要调用一项网络服务 我的客户向我提供了以下详细信息 这是 SOAP 对于产品 请使用它作为端点 Request

随机推荐

  • 在 ABPeoplePickerNavigationController 上取消选择RowAtIndexPath

    我在我的应用程序中将 ABPeoplePickerNavigationController 显示为选项卡 用户单击姓名 然后单击电子邮件地址 然后我对电子邮件地址执行某些操作 之后 我希望他们选择的人和财产淡出 不突出显示 在普通表中 我会
  • getOutputStream() 上的设备上“没有到主机的路由” - 无线连接

    private String urlPost http 192 168 1 66 8080 DataCollectionServlet Override protected void doWakefulWork Intent intent
  • 使用泛型类型构造函数时,Null (?) 运算符返回不正确的值。网络

    使用通用类型和空运算符时 我遇到一些奇怪的行为 为什么 obj2 CurrentDate 返回的日期值在使用时看起来不正确 简写 如果我在属性中长期使用 null 运算符 if 那么它会返回正确的预期值 我以为 相当于 if 表达式 ret
  • 配置 Kafka 以接受来自 Docker 内部和外部的客户端

    我正在 Docker 网络中运行 Apache Kafka Kafka Broker 的容器称为 docker kafka 我想要的是允许来自另一个 docker 容器以及 docker 主机的 Kafka 客户端的连接 docker ka
  • 复制关系表数据

    我希望我在这个问题上不会太啰嗦 我只是想确保我所问的内容完全清楚 我认为这相当令人困惑 我有一个数据库 其中有一堆表 并且设置了所有外键约束 关系有时会深达几张表 并且也存在子级与多个父表相关的情况 我想插入 顶级 表行之一的副本以及与其相
  • 体系结构 x86_64 的未定义符号:OS X、Boost Log、CMake

    链接的另一个问题 操作系统 X 10 9 5 x64 跨平台项目正在使用 CMake 工具链构建 使用升压 将所有可执行文件与 Boost Log 链接时出错 确实找到了 BOOST PATH 单元测试与 Boost Test 成功链接 第
  • Java - 通过浏览器/URL 连接到 ServerSocket

    我正在编写一个软件 并且受到无法使用套接字连接到使用 ServerSocket 的 java 应用程序的限制 我想我应该尝试使用 URL 连接 因为可以定义要连接到的端口 e g 127 0 0 1 62666 我的服务器应用程序正在侦听连
  • 无法建立到服务器的链接

    一个非常简单的插入函数 它给出了一些令人讨厌的错误 Like Warning mysql query Access denied for user one com using password NO in customers be be h
  • 编写一个程序来抓取论坛

    我需要编写一个程序来抓取论坛 我应该使用 Scrapy 框架用 Python 编写程序还是应该使用 Php cURL 还有与 Scrapy 相当的 Php 吗 Thanks 我会选择 Python 因为它具有卓越的 libxml2 绑定 特
  • 如何从unix连接到oracle数据库

    我正在尝试从我的 UNIX 机器连接到 Oracle 数据库 总的来说 我对剧本写作很陌生 我知道如何浏览unix并编写了基本脚本 读取 显示 并使用bash命令执行它们 我还知道如何查看 unix 中的变量 用户和系统 你能告诉我需要做什
  • Django 多项选择字段/复选框选择多个

    我有一个 Django 应用程序 想要在用户的个人资料中显示多项选择复选框 然后他们将能够选择多个项目 这是我的 models py 的简化版本 from profiles choices import SAMPLE CHOICES cla
  • 根据局部最小值/最大值计算累积增长/下降

    我正在学习 R 及其通过 quantmod lib 在交易任务中的应用 并定期浏览社区 从这里获得很多新知识和技巧 我对 R 的总体印象 特别是 quantmod lib 它非常棒 此时我需要经验丰富的 R 用户的帮助 我正在使用通过 ge
  • 如何将结构化数据保存到文件?

    我的程序包含大量具有恒定输出的预计算 我想避免在下次运行程序时运行此预计算 因此 我想在程序第一次运行时将其输出保存到文件中 并在下次运行程序时加载它 输出包含我自己定义的非常见数据类型 对象和结构 我该如何去做呢 反 序列化 Rust 对
  • 为什么我的测试没有在 Odoo 10 上运行?

    我创建了一个简单的待办事项应用程序 其结构如下 todo app init py manifest py tests init py tests todo py todo model py 在测试文件夹下我有 测试 init py codi
  • 如何向 Chart.js 添加数据集切换?

    我正在使用 Chart js 创建折线图 我想要四个不同的数据集 默认情况下它们都是可见的 但可以通过单击按钮来打开和关闭 如何才能实现这一目标 我似乎无法在文档中找到答案 addData removeData and update all
  • 如何检查命令是否可以执行?

    我有一个脚本将向用户显示一些压缩选项 gzip zip 和 bzip 由于这意味着可以在 Linux 和 Windows 上运行 并且 Zlib 库不可用 因此我必须使用 Unix 命令来压缩任何文件 当然 如果脚本在 Windows 上运
  • 如何使用 T-SQL 进行数据透视表?

    如何从此格式转换表格 Id Data Section 1 1AAA AAA 1 1BBB BBB 1 1CCC CCC 2 2AAA AAA 2
  • Python Websockets 无法通过互联网连接

    我只是想通过互联网获得一个非常基本的 websocket 连接 该代码看起来不错 因为它在连接到本地主机时有效 但由于某种原因 当我尝试通过互联网使用它时失败了 我正在使用网络套接字 https pypi python org pypi w
  • 为 pyspark 设置 SparkContext

    我是新手spark and pyspark 如果有人解释一下到底是什么 我将不胜感激SparkContext参数做什么 我该如何设置spark context对于Python应用程序 See here http spark apache o
  • 为什么 Cloneable 没有被弃用?

    人们普遍认为CloneableJava 中的接口已损坏 造成这种情况的原因有很多 我就不一一列举了 others http howtodoinjava com 2012 11 10 cloneable interface is broken