Tag: cloneable

为什么Java 8中的Cloneable中没有默认的clone()

Java中的可Cloneable本质上是破碎的。 具体来说,我对界面的最大问题是它需要一种不定义方法本身的方法行为。 因此,如果遍历Cloneable列表,则必须使用reflection来访问其定义的行为。 但是,在Java 8中,我们现在有了默认方法,现在我问为什么Cloneable没有默认的clone()方法。 我理解为什么接口不能默认Object方法 ,但是,这是一个明确的设计决策,因此可以做出exception。 我有点想象弃用Object.clone()并将其内部代码更改为: if(this instanceof Cloneable) { return ((Cloneable) this).clone(); } else { throw new CloneNotSupportedException(); } 继续使用任何魔法使clone()在Cloneable作为默认方法。 这并没有真正解决clone()仍然可以很容易地被错误地实现,但这本身就是另一个讨论。 据我所知,这种变化将完全向后兼容: 当前覆盖clone()但没有实现Cloneable (WHY ?!)的类在技术上仍然可以接受(即使在function上不可能,但这与以前没有什么不同)。 当前覆盖clone()但实现Cloneable的类在其实现上仍将起相同的作用。 当前没有覆盖clone()但是实现了Cloneable (WHY ?!)的类现在将遵循规范,即使它在function上并不完全正确。 使用reflection并引用Object.clone()那些仍然可以在function上工作。 即使它引用了Object.clone() super.clone()在function上仍然是相同的。 更不用说这将解决Cloneable一个巨大问题。 虽然繁琐且仍然容易错误地实现,但它将解决界面的巨大面向对象问题。 我能看到的唯一问题是那些实现Cloneable人没有义务覆盖clone() ,但这与之前没有什么不同。 这已在内部进行过讨论,但从未取得成果吗? 如果是这样,为什么? 如果是因为接口不能默认使用Object方法,那么在这种情况下做出exception是否有意义,因为inheritanceCloneable所有对象都期待clone() ?

Java的Serializable或Cloneable等标记接口的设计是否已在C#中进化?

Java在其标准库中提供了java.io.Serializable和java.lang.Cloneable (以及对语言和JVM的特殊支持),用于反序列化/序列化/克隆的任务。 C#选择了不同的路径来提供这种function,使用它的实现和代码与Java有何不同,为什么这样做? 例如,为什么C#同时使用属性(注释)和接口进行序列化?

使用复制构造函数而不是Object.clone进行深层复制的正确方法

我有一些代码使用Object.clone执行深层复制,但我正在尝试使用更“可接受”的复制构造函数重写它。 下面是我正在尝试做的两个简单示例,第一个使用克隆,第二个使用复制构造函数。 使用克隆的深层复制 import java.util.*; abstract class Person implements Cloneable { String name; public Object clone() throws CloneNotSupportedException { return super.clone(); } } class Teacher extends Person implements Cloneable { int courses; public String toString() { return name + “: courses=” + courses; } } class Student extends Person implements Cloneable { double gpa; public […]

关于java中的可克隆接口和object.clone()的困惑

如果我有: class foo implements Cloneable 然后做: bar = new foo(); bar.clone(); 我得到一个浅拷贝而不需要编写任何bar.clone()代码,就像我通常在实现接口时需要做的那样。 我的理解是接口的函数必须由实现它的类填充,并且Object.clone()没有实现(根据文档,“类对象本身不实现接口Cloneable”) 那么我的浅层克隆来自哪里? 如果Object.clone()没有实现,那么实现bar.clone()的代码在哪里? 我很困惑。

Effective Java:分析clone()方法

请考虑以下有效Java项目11(明智地覆盖克隆),其中Josh Bloch解释了clone()合同的错误。 这份合同存在许多问题。 “没有被称为构造函数”的规定过于强大。 一个行为良好的克隆方法可以调用构造函数来创建正在构建的克隆内部的对象。 如果类是final,clone甚至可以返回由构造函数创建的对象。 有人可以解释Josh Bloch在第一段中所说的“如果类是final ,则clone甚至可以返回由构造函数创建的对象”。 final与clone()有什么关系?