创建这样的接口并在需要确保变量可克隆的地方使用它是否存在任何不好或错误的地方?
public interface PublicCloneable<I> {
public I clone();
}
在SO上有关于Java中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
的想法是将一个类标记为可克隆的,并且克隆逻辑由 JVM 处理。你不能使用 Object.clone()
提供逐个字段的克隆。
你可以从 this answer 中建议的其他克隆机制中选择另一个(或与另一个接口结合使用)。
java.lang.Cloneable
是关于实现而不是接口的。不要将其与实际接口类型混淆。 - Tom Hawtin - tackline