Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:可克隆接口的基本原理_Java_Clone_Specifications_Cloneable - Fatal编程技术网

Java:可克隆接口的基本原理

Java:可克隆接口的基本原理,java,clone,specifications,cloneable,Java,Clone,Specifications,Cloneable,为什么在java.lang.Cloneable界面中没有指定.clone()方法?查看java bugs数据库中的此bug: 本质上,这是Java早期版本中的一个设计缺陷,他们不打算在可克隆接口中修复该缺陷,因为这样做会破坏与某些现有代码的兼容性。因为克隆方法是在对象类中实现的,这是由于其“特殊”条件:任何类型对象的内存副本。在Java中,有一种标记接口的概念。Cloneable接口没有方法或字段,仅用于标识可克隆的语义 网址: 您经常会遇到Java中没有行为的接口。换句话说,它们只是空的接口

为什么在
java.lang.Cloneable
界面中没有指定
.clone()
方法?

查看java bugs数据库中的此bug:


本质上,这是Java早期版本中的一个设计缺陷,他们不打算在可克隆接口中修复该缺陷,因为这样做会破坏与某些现有代码的兼容性。

因为克隆方法是在对象类中实现的,这是由于其“特殊”条件:任何类型对象的内存副本。

在Java中,有一种标记接口的概念。
Cloneable
接口没有方法或字段,仅用于标识可克隆的语义

网址:

您经常会遇到Java中没有行为的接口。换句话说,它们只是空的接口定义。这些被称为标记接口。Java API中的一些标记接口示例包括:


基本上,它是一个破损的界面。Ken Arnold和Bill Venners在一次会议上讨论了这个问题

阿诺德:

如果在这一点上我是上帝,而很多人可能很高兴我不是,我会说不赞成
Cloneable
并拥有一个
Copyable
,因为
Cloneable
有问题。除了拼写错误之外,
Cloneable
不包含
clone
方法。这意味着您无法测试某个内容是否是
Cloneable
的实例,将其强制转换为
Cloneable
,然后调用
clone
。你必须再次使用反射,这很糟糕。这只是一个问题,但我肯定会解决


在我工作的项目中,我们创建了一个名为PublicCloneable的接口,
它包含克隆方法并指定它是公共的

我发现这一点很有用:有一个克隆方法,但是你不能访问它,这一点帮助不大

public interface PublicCloneable extends Cloneable {
    public Object clone();
}

我不认为这是一个奇怪的概念。有时,能够看到某些东西是否可以作为替代类型是很有用的。正如其他人所说,Cloneable已经被打破了,它们应该充当混合器。在java这样的强类型语言中,这不是我最喜欢的机制,但对于Serializable来说,它是有意义的,sorta.@Serializable会更有意义。或者至少如果注释早十年出现的话就可以了。我喜欢tom的最后一句评论:)有很多功能应该在十年前就出现了……使用这个接口(publicconable)的方式是什么?@Otto:例如,一个带有方法public static publicconable copy(publicconable obj)的CloneHelper,当您从本地缓存返回一个对象时,它会检查null,或者只检查copy(Object obj),并同时检查publiccloneable的null和instanceof,例如。。。也就是说,序列化/反序列化可能更安全。“并指定它是公共的。”-实际上,接口中定义的方法在默认情况下是公共的。不需要在代码中提及这一点@Nicolas为什么不在Java8中修复它?Java的坏的/无效的部分以前没有被删除/更改过吗?它之所以“坏”是因为有几个人这么说?“Cloneable不包含克隆方法”是的,而且它的文档从未说过它会。“这意味着您无法测试某个东西是否是可克隆的实例,将其转换为可克隆,然后调用克隆。”再说一遍,这根本不是
Cloneable
的目的
Cloneable
只是让
Object.clone()
抛出异常或不抛出异常。它从来不是供您调用
clone
的接口。如果Java有这样一个接口可能会更好,但缺少这样一个接口并不会导致另一个接口(
Cloneable
)崩溃。@newacct仅仅因为其行为与其文档匹配,并不能使它成为一个好的接口。我猜如果你的代码不起作用,你只是改变文档?@ EpCigPANDAc武力可能是因为我们不想在某些情况下模仿C++。克隆技术应该小心使用,大多数时候它并不能达到你想要的效果。Java缺少的是
const
参数,但是复制每个(可变)对象实例并不是一个好的解决方案。是的,Java在某些方面很糟糕,这就是其中之一。使用Kotlin/data类。