如何创建具有相同值的新实例?

时间:2014-01-08 07:59:52

标签: java

实际上,我在网上搜索了解决方案。我还找到了Copy an object in Java。在我的对象中,有很多映射。 即使我使用CloneableCopy Constructor,我仍需要复制每个字段吗?

我的要求是了解Old ObjectNew Object之间哪些数据发生了变化。

我的对象示例树:

MotorProposal
    - startDate : Date              ---> can change
    - endDate : Date                ---> can change
    - customer : Cutomer
    - vehicleList : List<Vehicle>   ---> can chnage
        - carNo : String            ---> can change
        - loading : int             ---> can change
        - cubicCapacity : int       ---> can chnage
        - driver : Driver           ---> can change
            - fullName : String     ---> can change
            - address : Stirng      ---> can change
            - license : Stirng      ---> can change
            - expYear : int         ---> can change
        - model : Model

        -there other fields

    -there other fields

是否有其他方法可以创建具有相同值的新实例而无需复制每个字段?

我的预期计划

MotorProposal oldProposal = --> come from DB
MotorProposal newProposal = org.someapi.ObjectUtil.newInstance(oldProposal);

更新

目前,我解决了马丁·迪诺夫建议的这个案例。如下所示。

ObjCopy.java

public class ObjCopy {
    public static Serializable newInstance(Serializable obj) {
        Serializable result = null;
        try {
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(buffer);
            oos.writeObject(obj);
            oos.flush();
            oos.close();

            ByteArrayInputStream in = new ByteArrayInputStream(buffer.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(in);
            return (Serializable)ois.readObject();
        } catch (Exception e) {
            //do nothing
            e.printStackTrace();
        }
        return result;
    } 
}

Test.java

public class Test {
    public static void main(String[] args) {
        Country country = new Country();
        country.setName("Myanmar");
        Province province_1 = new Province();
        province_1.setCountry(country);
        province_1.setName("Yangon");

        Province province_2 = (Province)ObjCopy.newInstance(province_1);
        province_2.getCountry().setName("USA");
        System.out.println(province_1.getName() + "-" + province_1.getCountry().getName());
        System.out.println(province_2.getName() + "-" + province_2.getCountry().getName());
    }
}   

输出

Yangon-Myanmar
Yangon-USA

2 个答案:

答案 0 :(得分:3)

Yoni Roit从您提供的Stackoverflow链接的第二个提案怎么样?换句话说,序列化然后反序列化对象 - 这将导致按字节深度复制对象。你需要让你的类实现Serializable。只要所有类字段都可以序列化,这种方法应该可行。但是,序列化和反序列化对象显然可能非常缓慢 - 如果您想要方便而不是效率,这可能不是问题。这是一个重新创建新ArrayList的简单示例:

    ArrayList<Integer> foo = new ArrayList<Integer>();
    foo.add(5);
    foo.add(3);
    foo.add(1);
    ArrayList<Integer> obj = null;
    // Write the object out to a byte array
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream out = new ObjectOutputStream(bos);
    out.writeObject(foo);
    out.flush();
    out.close();

    // Make an input stream from the byte array and read
    // a copy of the object back in.
    ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(
            bos.toByteArray()));
    obj = (ArrayList<Integer>)in.readObject();

在你的情况下,你当然希望输入你的特定课程。这样您就不必显式复制类中的每个字段。

答案 1 :(得分:0)

没有CyCDemo,关于Cloneable接口存在很多问题,以及Java没有实现深层复制的原因和原因。

无论如何,请注意:

https://code.google.com/p/cloning/