Don*_*ote 12 java object cloneable
我知道这clone()是一个受保护的方法,但"受保护"意味着它可以被特定类的所有子类访问.
任何Java类都是其子类Object,那么受保护方法的原因是什么?
为什么我们clone()只能调用实现Cloneable接口的类?我不明白它是如何连接到一个事实,clone()在Object为受保护声明.
Cep*_*pod 11
Object的clone()方法非常特殊,因为它总是返回当前类的一个实例,它复制了所有字段(甚至是最终的).我不认为用普通的Java代码重现这一点,甚至不用反射.
因此,它必须可供所有类使用,但由于它不应该从外部调用,因为您不希望所有内容都是可克隆的,因此必须对其进行保护.
作为附加检查,clone检查该类是否实现Cloneable,只是为了确保您不会意外地克隆非可克隆的.
总而言之,克隆有点被打破,因为当你需要深度复制最终字段时它不起作用.我建议您按照此模式手动实施实例复制.
public class Base {
/** one or more public constructors */
public Base() { ... }
/** copy-constructor */
protected Base(Base src) { /* copy or deep-copy the state */ }
public Base copy() { return new Base(this); }
}
public class Derived extends Base {
/** one or more public constructors */
public Derived() { ... }
/** copy-constructor */
protected Derived(Derived src) {
super(src);
/* copy or deep-copy the state */
}
@Override
public Derived copy() { return new Derived(this); }
}
Run Code Online (Sandbox Code Playgroud)
因为那是他们设计的方式。在 Bug Parade 的某处有一个声明,说设计的最初原因是“迷失在时间的迷雾中”,但我记得 Sun 在 1990 年代的一次讨论中说该设计给出了四种可能的行为。
不记得细节了:-| 但你可以解决:
clone()方法是不可访问的,除非派生类。Cloneable:类可以被克隆,但clone()除了派生类之外,方法是不可访问的。Cloneable并提供您自己的clone()方法:如(2),但存在clone()公开并现在返回正确类型的可能性。clone()和抛出的类,NotCloneableException:您将返回到 1。把clone()插入接口就已经失去了一些这一点。
| 归档时间: |
|
| 查看次数: |
18582 次 |
| 最近记录: |