使用ECoreUtil.Copier复制的对象哈希码与原对象不同的原因
为什么ECoreUtil.Copier复制的EObject副本哈希码和原对象不同?
这其实是完全正常的情况,咱们来拆解背后的几个核心原因:
默认哈希码基于对象身份而非内容:EMF中的EObject默认继承了
java.lang.Object的hashCode()实现,这个实现是根据对象在内存中的地址(也就是对象的唯一身份)来生成哈希码的。ECoreUtil.Copier创建的是一个全新的实例,它在堆内存里有自己独立的地址,哪怕属性和原对象完全一致,身份不同哈希码自然也不一样。Copier的设计目标是值复制:
ECoreUtil.Copier的核心作用是生成对象的值副本——把原对象的所有属性、关联关系完整复制到新对象中,但它从一开始就没打算让副本和原对象共享身份。如果哈希码都一样了,那本质上就不是两个独立的对象了,这显然和“复制”的需求矛盾。若需基于内容的哈希码,需自定义实现:如果你希望内容一致的原对象和副本拥有相同的哈希码,那需要在你的EClass对应的Java类里重写
hashCode()方法,让它基于对象的属性值来计算。你可以直接复用EMF提供的EcoreUtil.hashCode(EObject)工具方法,它会遍历对象的所有属性生成基于内容的哈希码;或者自己实现逻辑,确保所有关键属性都被纳入哈希计算。
内容的提问来源于stack exchange,提问作者Manoj Keshavaprakash
相关产品推荐
相关产品推荐

