如何从不同的包深层复制相同的对象,但是没有序列化的结构相同?
示例:
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
。
编辑:更复杂的例子。
答案 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)
要制作属性或多或少匹配的不同类的对象的副本,您可以使用Dozer或mapstruct等映射库。这些使用起来非常简单,如果类结构相似甚至相等(即字段具有相同的名称和类型),则生成这样的映射并仅使用几行。
使用哪一个取决于您,但是maptruct似乎更快,因为它不使用反射但在编译时生成类。这是两者的比较(虽然我必须承认我不确定它是否有偏见):http://mariusz.wyszomierski.pl/en/mapping-dozer-vs-mapstruct/
公平地说,如果你对其中一个不满意,还会有很多其他的映射库。