使用Xtend生成Java代码时避免覆盖开发者编写的方法内容
解决Xtend生成Java代码时覆盖开发者自定义内容的问题
这是Xtend代码生成里很常见的痛点,别担心,Xtend本身就提供了保护用户手写代码的机制,核心思路是把开发者需要修改的部分和自动生成的部分明确分开,让生成器只更新它负责的区域。
下面是具体的实现步骤:
1. 使用Xtend的「可编辑区域」标记
Xtend支持通过特定的模板指令标记来定义开发者可编辑的代码块,生成器会识别这些标记,在重新生成时跳过这些区域的内容。
你需要修改你的Xtend模板,把service方法改成这样:
class A { public void service() { «generated NOT editable» // this section is reserved to be implemented by the developer «editable» // 这里放开发者手写的代码,重新生成不会被覆盖 «endEditable» } }
生成后的Java代码会自动带上保护标记:
public class A { public void service() { // this section is reserved to be implemented by the developer // begin-user-code // 这里放开发者手写的代码,重新生成不会被覆盖 // end-user-code } }
注意:«generated NOT editable»是Xtend的模板指令,用来标记生成器专属的管理区域;«editable»和«endEditable»之间的部分就是受保护的用户代码区,生成器会完全跳过这部分的更新。
2. 确认Eclipse的增量生成配置
在Eclipse里,还要确保项目的生成器配置支持增量更新:
- 右键你的项目 → Properties → Xtend
- 勾选「Enable incremental building」(默认一般是勾选状态,但最好确认一遍)
- 把「Clean build strategy」设置为「Incremental」,这样只有当DSL文件的变动影响到生成代码的非编辑区域时,才会触发更新,而且绝对不会触碰用户编辑的部分。
3. 代码分离的最佳实践
- 永远只在
«editable»块内编写自定义代码,不要修改生成器管理的区域 - 如果需要扩展类的功能,优先考虑用继承的方式(如果你的DSL支持),从生成类派生子类来添加逻辑,能彻底避免生成器和手写代码的冲突
这样设置之后,每次修改DSL文件并保存,Eclipse只会更新生成代码中属于自动生成的部分,你在service方法里写的自定义代码就再也不会被删除啦!
内容的提问来源于stack exchange,提问作者Łøćçâz Ł'âvîëstà
相关产品推荐
相关产品推荐

