EqualsVerifier断言错误:重要字段:equals不使用<fieldname>,或者它是无状态的

时间:2018-10-18 13:46:30

标签: equalsverifier

使用lombok,meanbean和equalsverifier的Java 8设置(所有3种功能的巨大支持者,并且还限制了我可以根据公司政策使用的版本-在equalsverifier的2.3.3上):

@Data
@NoArgsConstructor
class A {...}

@Data
@NoArgsConstructor
class B extends class A {...}

我在调用EqualsVerifier时收到“重要字段”错误:

EqualsVerifier.forClass(B.class)
                .withRedefinedSuperclass()
                .suppress(Warning.STRICT_INHERITANCE, Warning.NONFINAL_FIELDS, Warning.INHERITED_DIRECTLY_FROM_OBJECT).verify();

将类B更改如下,并重新定义了超类错误:

@NoArgsConstructor
@ToString(callSuper=false)
class B extends class A {...}

再次更改类B,如下所示,但出现重要字段错误:

@NoArgsConstructor
@ToString(callSuper=false)
@EqualsAndHashCode(callSuper=false)
class B extends class A {...}

有什么建议吗?我不知道该如何通过。

1 个答案:

答案 0 :(得分:1)

此处是EqualsVerifier的创建者。

我没有足够的信息来帮助您-AB有哪些领域?另外,我不确定Lombok的@Data是否可以继承;您必须检查他们的文档或进行一些实验。

也就是说,将equals与继承正确结合起来很难。我通常给别人的建议是,不要这样做。如果需要,我已经在EqualsVerifier manual中写了一些有关它的内容。我还建议您阅读this article以获得一些背景信息。

一般经验法则:

  • 如果您重写equals方法并打算添加状态,则总是在它们中调用super。
  • 如果不需要扩展类,请创建类final。在这种情况下,B可能是最终的,这将使您更容易安抚EqualsVerifier。
  • 如果您不知道Lombok生成什么代码,请使用Delombok