Groovy @EqualsAndHashCode注解版本兼容性变更及替代解决方案咨询
解决Groovy 2.5中@EqualsAndHashCode父类字段兼容性问题的方案
当然不用自己手动实现equals()和hashCode()!针对你遇到的Groovy 2.4到2.5的注解兼容性问题,有两个简洁的解决方案:
方案一:利用callSuper = true结合父类注解(推荐)
既然你已经在父类Level0上添加了@EqualsAndHashCode注解处理自身字段,子类只需要让注解调用父类的实现,同时只在includes中声明子类自己的字段即可。
修改后的代码如下:
import groovy.transform.EqualsAndHashCode @EqualsAndHashCode(includes = ['level0field'], includeFields = true) abstract class Level0 { String level0field } // 只保留子类字段在includes中,callSuper会调用父类的equals/hashCode逻辑 @EqualsAndHashCode(includes = ['level1field'], callSuper = true, includeFields = true) class Level1 extends Level0 { String level1field }
这个方案完全符合Groovy 2.5的设计规范:父类的字段由父类的注解负责处理,子类通过callSuper = true集成父类的逻辑,最终生成的方法会同时包含父类和子类的字段,效果和你在Groovy 2.4中的写法一致。
方案二:使用includeSuperFields = true(适用于父类未加注解的场景)
如果你的父类没有添加@EqualsAndHashCode注解,又想在子类中直接包含父类字段,可以用Groovy 2.5新增的includeSuperFields属性,配合includes指定子类字段:
import groovy.transform.EqualsAndHashCode abstract class Level0 { String level0field } @EqualsAndHashCode(includes = ['level1field'], includeSuperFields = true, includeFields = true) class Level1 extends Level0 { String level1field }
不过这个方案只适合父类未注解的情况,因为如果父类已经有注解,再用includeSuperFields可能会导致字段重复计算,所以优先推荐方案一。
为什么Groovy 2.5会报错?
Groovy团队在2.5版本中对@EqualsAndHashCode的includes属性做了严格校验:现在它只能指定当前类的属性/字段,不再允许跨继承层级引用父类字段。这个变更的目的是避免继承层次复杂时出现歧义,比如父类字段被重写、或者不同层级字段重名的情况。
内容的提问来源于stack exchange,提问作者David Brown
相关产品推荐
相关产品推荐

