为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 Java 不提供默认的复制构造函数?

为什么 Java 不提供默认的复制构造函数?

慕森卡 2022-05-12 15:34:45
我知道以下代码段仅创建对某处存在的对象的新引用:MyClass obj = new MyClass(); MyClass copy = obj;但是为什么 Java 在以下情况下不提供默认的复制构造函数:MyClass obj = new MyClass(); MyClass copy = new MyClass(obj);我相信隐式复制构造函数可以做一些类似于 C++ 的事情,即在每个成员上调用复制构造函数。这将导致对象的深拷贝,假设所有管理资源的类都正确地实现了它们的拷贝构造函数。添加这样的功能也应该是向后兼容的,因为现在如果没有该类的显式复制构造函数,第二个片段将无法编译。所以,为了让我的问题更准确:是否有任何东西阻止 Java 创建隐式复制构造函数,它会在所有成员上调用复制构造函数?现在添加隐式复制构造函数可能会破坏任何现有程序吗?
查看完整描述

2 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

是否有任何东西阻止 Java 创建隐式复制构造函数,它会在所有成员上调用复制构造函数?

主要是这显然不是它应该做的事情。

在这种情况下,也许你想要一个深拷贝;在这种情况下,也许你想要一个浅拷贝;也许您根本不希望在另一种情况下复制实例;也许您希望以这些方式混合复制特定类的字段。

此外,添加此构造函数是另一种方法:在方法数量很重要的环境中(例如 Android 的 64k Dex 限制),您为不需要的东西付费。

如果需要,最好通过明确的方式让您这样做。


但是是什么阻止了Java 拥有这个呢?

鉴于您可以手动定义复制构造函数,自动添加它们在技术上显然是可行的。

我建议你不能这样做的一个原因是没有语言机制可以“删除”你不想被复制的类的构造函数。

很容易表明您不想要默认 ctor:只需使用任何签名定义您自己的 ctor。但是你不能对默认的复制 ctor 做同样的事情:根据定义,复制 ctor 只会有签名YourClass(YourClass instance);所以你不能要求,比如说,你定义一个抛出的显式复制ctor,因为你已经将编译时错误(不存在这样的ctor)更改为运行时错误(它存在,但抛出)。

因此,您必须开始发明额外的机制来删除构造函数——比如说,一个特殊的注释。但这需要更改工具来支持它。

从绝对意义上说,这并非不可能——但需要大量工作来更改语言以添加可以在现有语言中实现的功能。


查看完整回答
反对 回复 2022-05-12
?
HUH函数

TA贡献1836条经验 获得超4个赞

但确实如此。它是在类中调用clone()并实现的方法Object

所以你想要做的,可以通过以下方式实现:

MyClass obj = new MyClass(); 
MyClass copy = (MyClass) obj.clone();


查看完整回答
反对 回复 2022-05-12
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信