3

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

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

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

4

3 回答 3

2

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

于 2011-07-17T22:19:10.057 回答
1

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

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

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

于 2011-07-17T20:00:31.253 回答
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
        }
   }

我不确定它是否可以编译,但我试过了,看起来还可以。

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

于 2011-07-17T20:09:50.210 回答