gpt4 book ai didi

java - 在 Java 中克隆对象 [3 个问题]

转载 作者:行者123 更新时间:2023-12-01 19:22:09 26 4
gpt4 key购买 nike

这样做会调用Asub的clone方法吗?或者Asub深度克隆是否正确?如果没有的话,有没有办法通过这种方法来深度克隆Asub?

abstract class Top extends TopMost {
protected Object clone() {
Object obj = super.clone();
// deep copy and try catch
}


}

abstract class A extends Top {
protected Object clone() {
Object obj = super.clone();
// deep copy and try catch
}


}

class Asub extends A {
protected Object clone() {
Object obj = super.clone();
// deep copy and try catch
}

public void doSomethingNew() {
}
}

abstract class TopMost {
public void someMethod() {
Top a = (Top) super.clone();
// more code here
}
}

public class Main {
public static void main(String... args) {
Asub class1 = new Asub();
class1.someMethod();
}
}

最佳答案

首先,请注意 the clone() interface is broken ,因此不应在新代码中使用。最好实现复制构造函数

但是,如果您确实需要这样做,正确的方法是让TopMost实现Cloneable。为什么? 《Effective Java》第二版第 11 条说道:

So what does Cloneable do, given that it contains no methods? It determines the behavior of Object’s protected clone implementation: if a class implements Cloneable, Object’s clone method returns a field-by-field copy of the object; otherwise it throws CloneNotSupportedException.This is a highly atypical use of interfaces and not one to be emulated. Normally, implementing an interface says something about what a class can do for its clients. In the case of Cloneable, it modifies the behavior of a protected method on a superclass.

此外,Asub.clone 应声明为public,而不是protected - 否则您无法从外部世界调用它。另外,如果您使用的是 Java5 或更高版本,则 Asub.clone 返回 Asub 而不是 Object 是合法且可取的(对于它的父类(super class))。

您不会在类中显示任何成员 - 各个类中的 clone 实现可能会有很大不同,具体取决于该类中成员的类型。也就是说,如果一个类有任何可变成员,您需要仔细地深度复制所有这些成员,否则您最终会得到共享其内部状态的不同对象。

但是,假设您的类只有原始字段或不可变字段,则克隆会按预期工作,尽管您的抽象类中有很多不必要的 clone 方法,所有这些方法都只需调用 super.clone() - 仅使用 Asub.clone() 可能会更好。

顺便说一句,如果 Top a = (Top) super.clone() 没有拼写错误,那么您就引入了从基类到派生类的依赖关系,这不是一个好主意。

关于java - 在 Java 中克隆对象 [3 个问题],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3652748/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com