元编程:将equals(Object o)和hashCode()添加到库类中

时间:2014-05-30 12:28:18

标签: groovy metaprogramming equals hashcode

我有一个需要在项目中使用的域对象库,但是我们发现有几个类没有实现equalshashCode方法。

我正在寻找最简单(和Grooviest)的方法来添加这些方法。显然我可以创建一个只添加方法的子类,但这对于习惯于库的开发人员来说会让人感到困惑,并且意味着我们必须重构现有的代码。

无法更改源(当前)。

如果我可以编辑该类,我只会使用@EqualsAndHashCode注释来执行AST转换(在编译时?),但我找不到指示编译器执行转换的方法在一个我无法直接注释的类中。

我目前正在尝试使用ExpandoMetaClass编写一个示例,所以我会做类似的事情:

MySuperClass.metaClass.hashCode = { ->
  // Add dynamic hashCode calculation bits here 
}
MySuperClass.metaClass.equals = { ->
  // Add dynamic hashCode calculation bits here 
}

我真的不想为每个类手动编写hashCode / equals方法,因此我正在寻找可以使用的动态dyamic(如@EqualsAndHashCode)此

我是否在正确的轨道上?有一种更加时髦的方式吗?

1 个答案:

答案 0 :(得分:2)

AST变换仅在编译时应用,因此您不会得到@EqualsAndHashCode之类的帮助。 MetaClass黑客将成为您唯一的选择。也就是说,有更优雅的方式来强加MetaClass行为。

无耻的自我插件我去年在SpringOne 2GX上谈过这种事情:http://www.infoq.com/presentations/groovy-app-architecture

简而言之,您可能会发现创建扩展程序的好处(除非您使用Grails) - http://mrhaki.blogspot.com/2013/01/groovy-goodness-adding-extra-methods.html,或明确添加mixins - http://groovy.codehaus.org/Runtime+mixins ...但总的来说,这些只是更干净如何完成你已经做过的完全相同的事情。