【发布时间】:2011-10-07 06:22:23
【问题描述】:
创建这样的接口并在需要确保变量可克隆的地方使用它有什么不好或错误的地方吗?
public interface PublicCloneable<I> {
public I clone();
}
SO 中的问题与 java 的 Cloneable 接口已损坏这一事实有关,我不明白为什么它没有像这样实现。
【问题讨论】:
标签: java generics interface clone cloneable
创建这样的接口并在需要确保变量可克隆的地方使用它有什么不好或错误的地方吗?
public interface PublicCloneable<I> {
public I clone();
}
SO 中的问题与 java 的 Cloneable 接口已损坏这一事实有关,我不明白为什么它没有像这样实现。
【问题讨论】:
标签: java generics interface clone cloneable
你可以。创建一个新接口的主要问题是你只能在你创建的新类上使用这个接口,这些新类显式地实现了这个接口。 Java 库中的现有类无法实现此接口,因为您无法更改它们的代码。 (该接口不会神奇地应用于现有类型。)因此,仅当您为您希望使用的所有对象创建或创建一系列自定义类并且不使用标准库类时,它才有用。
【讨论】:
如果您想完全使用自己的clone() 实现,应该没问题。但是,如果您想在某个时候使用 Object.clone(),我建议
public interface PublicCloneable<I> extends Cloneable {
public I clone();
}
和内部实现:
public static class MyClass implements PublicCloneable<MyClass> {
public MyClass clone() {
try {
return (MyClass)super.clone(); // Or do whatever you need here
} catch (CloneNotSupportedException e) {
// Always supported
}
}
我不确定它是否可以编译,但我试过了,似乎没问题。
当然,里程可能会有所不同。
【讨论】:
java.lang.Cloneable 是关于实现而不是接口。不要将它与实际的接口类型混为一谈。
这很好,但您必须在方法中提供自己的克隆逻辑。
java.lang.Cloneable 的想法是将一个类标记为可克隆,并且克隆逻辑由 JVM 处理。您不使用 Object.clone() 提供逐字段克隆
您可以从this answer 建议的克隆机制中选择另一种克隆机制(或将您的界面与另一种结合使用)。
【讨论】: