等于验证程序断言错误:有效字段:等于不使用 <fieldName>,或者它是无状态的



设置,java 8使用lombok,meanbean和equalsverifier(所有3个的忠实粉丝,并且我也限制了每个co.策略可以使用的版本 - 在equalsverifier的2.3.3上(:

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

我收到调用等于验证程序的有效字段错误:

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 {...}

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

EqualsVerifier 的创建者。

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

也就是说,将equals与继承正确结合起来很难正确。我通常给人们的建议是,不要这样做。如果你必须这样做,我已经在EqualsVerifier手册中写了一些关于它的东西。我还建议您阅读本文以获取一些背景信息。

作为一般经验法则:

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

相关内容

最新更新