java - 克隆() vs 复制构造函数 vs 工厂方法?

标签 java clone

我在 Java 中实现 clone() 时快速搜索了一下,发现: http://www.javapractices.com/topic/TopicAction.do?Id=71

它有以下评论:

copy constructors and static factory methods provide an alternative to clone, and are much easier to implement.

我只想做一个深拷贝。实现 clone() 似乎很有意义,但是这篇 google 排名很高的文章让我有点害怕。

以下是我注意到的问题:

复制构造函数不适用于泛型。

这是一些无法编译的伪代码。

public class MyClass<T>{
   ..
   public void copyData(T data){
       T copy=new T(data);//This isn't going to work.    
   }
   ..
}

示例 1:在泛型类中使用复制构造函数。

工厂方法没有标准名称。

有一个可重用代码的接口(interface)真是太好了。

public class MyClass<T>{
    ..
    public void copyData(T data){
        T copy=data.clone();//Throws an exception if the input was not cloneable
    }
    ..
}

示例 2:在泛型类中使用 clone()。

我注意到 clone 不是一个静态方法,但是是否仍然需要对所有 protected 字段进行深拷贝?在实现 clone() 时,在不可克隆子类中引发异常的额外工作对我来说似乎微不足道。

我错过了什么吗?任何见解将不胜感激。

最佳答案

基本上,clone is broken .没有什么可以轻松地使用泛型。如果你有这样的事情(缩短以了解重点):

public class SomeClass<T extends Copyable> {


    public T copy(T object) {
        return (T) object.copy();
    }
}

interface Copyable {
    Copyable copy();
}

然后通过编译器警告,您可以完成工作。因为泛型在运行时被删除,所以复制的东西会在其中产生编译器警告。 在这种情况下是无法避免的。。在某些情况下是可以避免的(感谢 kb304),但并非完全如此。考虑您必须支持实现接口(interface)的子类或未知类的情况(例如,您正在遍历不一定生成相同类的可复制集合)。

关于java - 克隆() vs 复制构造函数 vs 工厂方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1106102/

相关文章:

Java - 使绘画程序更干净

java - 为什么 Thymeleaf International 只能与 ResourceBundleMessageSource 配合使用

linux - linux 内核中的 clone() 系统调用定义在哪里?

c++ - C++11 的 decltype 是否不需要克隆?

java - T::class.java.newInstance() 已弃用

java - 防止传递 JPA 存储库方法时 session 失败

java - Android 编程 - 总是重新启动相同的 Intent

javascript - jQuery 在同一页面上克隆两种形式的输入?

android - 如何以编程方式创建 ImageView 对象的多个副本?

java - 数组的clone()和system.arracopy()在Java中创建两个具有不同引用的数组?