Java公共克隆接口

时间:2011-07-17 19:43:15

标签: java generics interface clone cloneable

创建这样的界面是否有任何不好或错误,并在需要确保变量可克隆的地方使用它?

public interface PublicCloneable<I> {
    public I clone();
}

与SO相关的问题是java的Cloneable接口被破坏了,我不明白为什么它没有像这样实现。

3 个答案:

答案 0 :(得分:2)

你可以。创建新接口的主要问题是,您只能在您创建的新类上使用此接口,该接口将显式实现此接口。 Java库中的现有类无法实现此接口,因为您无法更改其代码。 (该接口并不神奇地适用于现有类型。)因此,只有在为所有希望使用的对象创建一系列自定义类时,它才有用,并且不使用标准库类。

答案 1 :(得分:1)

这很好,但您必须在方法中提供自己的克隆逻辑。

java.lang.Cloneable的想法是将一个类标记为可克隆,并将克隆逻辑标记为由JVM处理。您没有使用Object.clone()

提供逐字段克隆

您可以从this answer中建议的机制中选择另一种克隆机制(或将您的界面与其他界面结合使用)。

答案 2 :(得分:1)

如果您想完全使用自己的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
        }
   }

我不确定它是否编译,但我尝试过,似乎没问题。

当然,里程可能会有所不同。