如何修改Ecore XML文件,通过EMF生成equals()、hashCode()等非Getter/Setter方法?
嘿,我之前刚好解决过这个问题!EMF其实自带了很方便的配置,能让你在生成Java类的时候自动带上equals()和hashCode(),不用自己手动去写。下面是具体的操作步骤,分两种场景给你说:
如何用EMF自动生成equals()和hashCode()方法
方法一:通过GenModel配置(最常用,零代码修改)
- 首先确保你已经有对应的
.genmodel文件:如果还没有,右键你的sample.ecore文件,选择**Generate GenModel**,按照向导完成生成 - 打开
.genmodel文件后,选中顶层的EPackage节点(就是最上面那个和你的模型同名的节点),切换到Properties视图 - 在Properties视图里找到
Code Generation分类,找到Equals Hashcode选项,把它设置为true - 额外提个有用的配置:
Use Identical Equality。如果设为true,生成的equals会直接用==比较对象引用;如果设为false,会递归比较对象的所有属性值——大部分业务场景下选false更符合需求 - 最后右键GenModel的根节点,选择**
Generate All或者Generate Java Code**,生成的每个Java类里就会自动包含实现好的equals()和hashCode()了
方法二:自定义生成模板(进阶需求,适配特殊逻辑)
如果默认生成的equals/hashCode逻辑不符合你的业务要求,还可以自定义EMF的代码生成模板:
- 找到EMF安装目录下的模板文件夹,路径一般是
plugins/org.eclipse.emf.codegen.ecore_<你的EMF版本>/templates - 复制
java/Class.javajet文件到你的项目目录里,打开后找到equals和hashCode的生成片段,按照你的需求修改逻辑 - 回到GenModel的Properties视图,在
Code Generation分类下设置Template Directory为你自定义模板所在的文件夹路径 - 重新生成代码,就会按照你修改后的模板生成equals和hashCode了
几个注意点
- 如果你的模型里有临时属性(设置了
transient="true"),生成的equals/hashCode会自动忽略这些属性,不用额外处理 - 后续修改Ecore模型后,只要GenModel的配置没变,重新生成代码时equals和hashCode会自动同步更新,不用手动维护
内容的提问来源于stack exchange,提问作者Alex Thompson
相关产品推荐
相关产品推荐

