【问题标题】:Java public clone interfaceJava公共克隆接口
【发布时间】:2011-10-07 06:22:23
【问题描述】:

创建这样的接口并在需要确保变量可克隆的地方使用它有什么不好或错误的地方吗?

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

SO 中的问题与 java 的 Cloneable 接口已损坏这一事实有关,我不明白为什么它没有像这样实现。

【问题讨论】:

    标签: java generics interface clone cloneable


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我在便便类中学到的方法是使用复制构造函数进行克隆。所以它始终是 { return new MyClass(this) }。我从未使用过 Object.clone() ,我什至不知道它的用处(它会自动进行深层复制吗?)。无论如何,我只需要接口,因为我正在创建一个泛型类,其中类型参数必须实现方法克隆,所以我确保我可以使用它。由用户在其类中提供正确的克隆方法。
      • 呃。 java.lang.Cloneable 是关于实现而不是接口。不要将它与实际的接口类型混为一谈。
      • @Tom 您有权发表您的意见,但您当前形式的评论没有多大意义。
      • @joxnas:复制构造函数的问题在于它们不支持多态性。将派生对象传递给基类的复制构造函数将创建一个基类类型的新对象,该对象不支持派生对象独有的任何功能。例如,可能有一个 ShapeBase 类,它包含一个边界矩形,提供一些方法,如“translate”和“scale”,并有一个可覆盖的“Draw”方法,它简单地绘制一个“红色 X 框”;其他定义的形状对象会覆盖 draw 方法来绘制圆形、多边形等。
      • @joxnas:即使 ShapeBase 支持复制构造函数,将 Polygon 传递给期望通过调用“new ShapeBase(passedInShape);”来复制它的例程将创建 BaseShape,它将在原始多边形的边界矩形中绘制一个红色 X。人们可以像原始多边​​形一样平移、缩放等这种新形状,并且它的边界框会相应地移动,但是人们会丢失任何关于它的“多边形”。有两种解决方案:(1)让所有形状派生支持一个受保护的克隆方法,该方法将调用本机对象的克隆方法,或者......
      【解决方案3】:

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

      java.lang.Cloneable 的想法是将一个类标记为可克隆,并且克隆逻辑由 JVM 处理。您不使用 Object.clone() 提供逐字段克隆

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

      【讨论】:

      • 正要提到深度克隆。您在那里发布的主题很好。
      猜你喜欢
      • 2016-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多