2011-07-17 73 views
3

创建一个这样的接口有什么不好或错误,并在我需要确保一个变量是可复制的地方使用它吗?Java公共克隆界面

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

的是一个事实,SO相关的问题是爪哇Cloneable接口坏了,我不明白为什么它没有这样的实现。

回答

2

您可以。创建新接口的主要问题是,您只能在您创建的新类上使用此接口,并明确实现此接口。 Java库中的现有类无法实现此接口,因为您无法更改其代码。 (该接口不会奇迹般地应用于现有的类型。)所以它只有在您为所有期望使用的对象创建一个自定义类族时才有用,并且不要使用标准库类。

1

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

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

的逐场克隆您可以从this answer中提出的克隆机制中选择另一种克隆机制(或使用与另一个克隆机制的组合)。

+0

准备提及深层克隆。你在那里发布的好主题。 –

+0

请检查我对Alex Gitelman的回答的评论 – jmacedo

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 
     } 
    } 

我不知道,如果它编译,但我想和它似乎没问题。

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

+0

我在poo课程中学到的方法是使用复制构造函数执行克隆..所以它始终是{return new MyClass(this)}。我从来没有使用过Object.clone(),我甚至都没有意识到它是有用的(它是否会自动执行深层复制?)。无论如何,我只需要接口,因为我创建了一个泛型类,其中类型参数必须实现方法克隆,所以我确保我可以使用它。用户需要在其课程中提供正确的克隆方法。 – jmacedo

+0

Eurgh。 'java.lang.Cloneable'关于实现而非接口。不要将它与实际的接口类型混淆。 –

+0

@Tom您有权发表您的意见,但您对当前表单的评论没有多大意义。 –