为了账号安全,请及时绑定邮箱和手机立即绑定

clone()vs copy constructor vs factory方法?

clone()vs copy constructor vs factory方法?

至尊宝的传说 2019-08-26 17:47:53
clone()vs copy constructor vs factory方法?我在Java上实现了克隆()的快速谷歌,发现:http://www.javapractices.com/topic/TopicAction.do?Id = 71它有以下评论:复制构造函数和静态工厂方法提供了克隆的替代方法,并且更容易实现。我想做的就是做一份深刻的副本。实现clone()似乎很有意义,但这篇谷歌排名很高的文章让我有点害怕。以下是我注意到的问题:复制构造函数不适用于泛型。这是一些无法编译的伪代码。public class MyClass<T>{    ..    public void copyData(T data){        T copy=new T(data);//This isn't going to work.        }    ..}示例1:在泛型类中使用复制构造函数。工厂方法没有标准名称。拥有可重用代码的接口非常好。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()时,在非可克隆子类中抛出异常的额外工作对我来说似乎微不足道。我错过了什么吗?任何见解将不胜感激。
查看完整描述

3 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

基本上,克隆被打破了。什么都不会轻易与泛型一起使用。如果你有这样的东西(缩短以获得重点):

public class SomeClass<T extends Copyable> {


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

然后使用编译器警告您可以完成工作。因为泛型在运行时被擦除,所以执行复制的东西会在其中生成编译器警告生成强制转换。在这种情况下,这是不可避免的。。在某些情况下这是可以避免的(谢谢,kb304),但不是全部。考虑必须支持子类或实现接口的未知类的情况(例如,您正在迭代不一定生成相同类的可复制副本集合)。


查看完整回答
反对 回复 2019-08-26
?
侃侃无极

TA贡献2051条经验 获得超10个赞

还有Builder模式。有关详细信息,请参阅Effective Java

我不明白你的评价。在复制构造函数中,您完全了解类型,为什么需要使用泛型?

public class C {
   public int value;
   public C() { }
   public C(C other) {
     value = other.value;
   }}

最近这里也有类似的问题。

public class G<T> {
   public T value;
   public G() { }
   public G(G<? extends T> other) {
     value = other.value;
   }}

一个可运行的样本:

public class GenTest {
    public interface Copyable<T> {
        T copy();
    }
    public static <T extends Copyable<T>> T copy(T object) {
        return object.copy();
    }
    public static class G<T> implements Copyable<G<T>> {
        public T value;
        public G() {
        }
        public G(G<? extends T> other) {
            value = other.value;
        }
        @Override
        public G<T> copy() {
            return new G<T>(this);
        }
    }
    public static void main(String[] args) {
        G<Integer> g = new G<Integer>();
        g.value = 1;
        G<Integer> f = g.copy();
        g.value = 2;
        G<Integer> h = copy(g);
        g.value = 3;
        System.out.printf("f: %s%n", f.value);
        System.out.printf("g: %s%n", g.value);
        System.out.printf("h: %s%n", h.value);
    }}


查看完整回答
反对 回复 2019-08-26
?
千巷猫影

TA贡献1829条经验 获得超7个赞

Java没有与C ++相同的复制构造函数。

你可以有一个构造函数,它接受一个与参数类型相同的对象,但很少有类支持这个。(少于支持克隆的数量)

对于通用克隆,我有一个辅助方法,它创建一个类的新实例,并使用反射复制原始字段(浅拷贝)(实际上像反射但更快)

对于深层复制,一种简单的方法是序列化对象并对其进行反序列化。

顺便说一句:我的建议是使用不可变对象,然后你就不需要克隆它们了。;)


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 619 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号