3

使用 lombok、meanbean 和 equalsverifier 的 java 8 设置(所有 3 个的超级粉丝,并且还限制了我可以使用的每个 co.policy 的版本 - 在 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 {...}

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

4

1 回答 1

1

EqualsVerifier 的创建者在这里。

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

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

作为一般经验法则:

  • equals如果您覆盖它们并打算添加状态,请始终在您的方法中调用 super 。
  • final如果您不需要从它们扩展,请创建您的课程。在这种情况下,B可能是最终的,这将使您更容易安抚 EqualsVerifier。
  • 如果您不知道 Lombok 生成什么代码,请使用Delombok
于 2018-10-21T14:39:24.410 回答