没有包名称的深层副本

时间:2016-07-21 13:57:27

标签: java packages deep-copy

如何从不同的包深层复制相同的对象,但是没有序列化的结构相同?

示例:

package com.foo;
class Tree{
    List<Leaf> leaf;
    Int trunk;
}

package com.bar;
class Tree{
    List<Leaf> leaf;
    Int trunk;
}

两者都有更复杂的子对象(ArrayLists的ArrayLists)。 这基本上是我通过不同的Web服务接收的对象,因此在不同的包中。

我希望能够&#34;映射&#34;同一个对象的所有不同版本,例如

施法:com.bar.Tree barTree = (com.foo.Tree) fooTree;

或深拷贝:com.bar.Tree barTree = DeepCopy.(fooTree);

预期结果为barTree.leaf[k] == fooTree.leaf[k]barTree.trunk==fooTree.trunk

理论上我可以通过反射递归地将所有校准复制到另一个对象的相应元素(同名),但是不是更方便吗?

编辑:更复杂的例子。

2 个答案:

答案 0 :(得分:1)

您可以在每个类中添加所谓的复制构造函数,该类接受另一个类的实例作为参数:

package main

import "sync"

type Something struct {
    Name string
}

var pool = sync.Pool{
    New: func() interface{} {
        return &Something{}
    },
}

func main() {
    s := pool.Get().(*Something)
    defer pool.Put(s)
    s.Name = "hello"
    // use the object
}

然后你会做以下事情:

package com.foo;
class Tree{
    String leaf;
    Int trunk;
    Tree(com.bar.Tree tree){
         this.leaf = tree.leaf;
         this.trunk = tree.trunk;
    }

}

答案 1 :(得分:0)

要制作属性或多或少匹配的不同类的对象的副本,您可以使用Dozermapstruct等映射库。这些使用起来非常简单,如果类结构相似甚至相等(即字段具有相同的名称和类型),则生成这样的映射并仅使用几行。

使用哪一个取决于您,但是maptruct似乎更快,因为它不使用反射但在编译时生成类。这是两者的比较(虽然我必须承认我不确定它是否有偏见):http://mariusz.wyszomierski.pl/en/mapping-dozer-vs-mapstruct/

公平地说,如果你对其中一个不满意,还会有很多其他的映射库。