Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建具有相同值的新实例?_Java - Fatal编程技术网

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

Java 如何创建具有相同值的新实例?,java,Java,事实上,我在网上搜索了解决方案。我也发现了。在我的对象中,有很多映射。 即使我使用Cloneable和Copy Constructor,我仍然需要为每个字段复制 我的要求是知道在旧对象和新对象之间更改了哪些数据 我的对象示例树: MotorProposal - startDate : Date ---> can change - endDate : Date ---> can change - custo

事实上,我在网上搜索了解决方案。我也发现了。在我的对象中,有很多映射。 即使我使用
Cloneable
Copy Constructor
,我仍然需要为每个字段复制

我的要求是知道在
旧对象
新对象
之间更改了哪些数据

我的对象示例树:

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
更新

目前,我解决了Martin Dinov建议的这个案例。如下

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

Yoni Roit从您提供的Stackoverflow链接中提出的第二个建议如何?换句话说,序列化然后反序列化对象-因此这将导致按字节深度复制对象。您需要让类实现可序列化。只要所有类字段都可以序列化,这种方法就应该有效。然而,序列化和反序列化对象显然会非常慢——如果出于方便而不是效率考虑,那么这可能不是问题。下面是一个重新创建新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();
ArrayList foo=new ArrayList();
foo.add(5);
foo.add(3);
foo.add(1);
ArrayList obj=null;
//将对象写入字节数组
ByteArrayOutputStream bos=新建ByteArrayOutputStream();
ObjectOutputStream out=新的ObjectOutputStream(bos);
out.writeObject(foo);
out.flush();
out.close();
//从字节数组生成输入流并读取
//将对象的副本放回。
ObjectInputStream in=新建ObjectInputStream(新建ByteArrayInputStream(
toByteArray());
.readObject()中的obj=(ArrayList);

在您的情况下,您当然希望键入特定类的cast。通过这种方式,您不必显式复制类中的每个字段。

没有CyCDemo,关于可克隆接口以及Java没有实现深度复制的原因和原因有很多问题

无论如何,请注意:


SerializationUtils.clone如何[metod..?您链接到的Q的答案中有哪部分没有回答您的问题?不,没有神奇的方法不复制字段并将其复制。另外,请注意,您需要进行深度复制;您需要复制列表的内容,而不仅仅是对列表的引用。(如上面的评论所述,您可以使用序列化技术,但这会增加很多开销,并且可能会产生巨大的第三方依赖性)谢谢你的帮助suggestion@CycDemo如果您的目的只是想知道模型对象的哪些数据被修改了,为什么不使用PropertyChangeListeners而不是deep copy的所有麻烦呢?请参考示例。
    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();