@EqualsAndHashCode


获取企业版 Lombok

@EqualsAndHashCode

 

Equality made easy:从对象的字段生成hashCodeequals实现。

Overview

任何类定义都可以用注释@EqualsAndHashCode来让 lombok 生成equals(Object other)hashCode()方法的实现。默认情况下,它将使用所有非静态、非瞬态字段,但您可以通过使用@EqualsAndHashCode.Include或标记类型成员来修改使用哪些字段(甚至指定要使用各种方法的输出) @EqualsAndHashCode.Exclude或者,您可以通过标记@EqualsAndHashCode.Include和使用来准确指定您希望使用的字段或方法@EqualsAndHashCode(onlyExplicitlyIncluded = true)

如果应用于@EqualsAndHashCode扩展另一个类的类,则此功能会变得有些棘手。通常,为此类类自动生成equalsandhashCode方法是一个坏主意,因为超类还定义了字段,这些字段也需要 equals/hashCode 代码,但不会生成此代码。通过设置callSupertrue,您可以在生成的方法中包含超类的equalshashCode方法。对于hashCode,结果super.hashCode()包含在哈希算法中,对于equals,如果超级实现认为它不等于传入的对象,则生成的方法将返回false。请注意,并非所有equals实现都能正确处理这种情况。但是,lombok 生成的equals实现一定要正确处理这种情况,所以如果它也有一个 lombok 生成的equals方法,你可以安全地调用你的超类 equals。如果你有一个明确的超类,你不得不提供一些价值callSuper来承认你已经考虑过它;不这样做会导致警告。

当你不扩展任何东西(你扩展)时 设置callSupertruejava.lang.Object是一个编译时错误,因为它会将生成的equals()hashCode()实现变成具有与简单地从继承这些方法相同的行为java.lang.Object:只有同一个对象将等于每个其他并且将具有相同的hashCode。扩展另一个类时不设置callSupertrue会生成警告,因为除非超类没有(平等重要)字段,否则 lombok 无法为您生成考虑到超类声明的字段的实现。您需要编写自己的实现,或依赖callSuper链接工具。您也可以使用lombok.equalsAndHashCode.callSuper配置键。

Lombok 0.10 中的新功能:除非您的类 isfinal和 extends java.lang.Object,否则 lombok 会生成一个canEqual方法,这意味着 JPA 代理仍然可以等于它们的基类,但是添加新状态的子类不会破坏 equals 契约。本文解释了为什么需要这种方法的复杂原因:How to Write an Equality Method in Java如果层次结构中的所有类都是 scala 案例类和具有 lombok 生成的 equals 方法的类的混合,则所有相等性都将“正常工作”。如果您需要编写自己的 equals 方法,则应始终canEqual在更改equalsand时覆盖hashCode

Lombok 1.14.0 中的新功能:要将注释放在(以及,如果相关, )方法的other参数上,您可以使用. 不过要小心!这是一个实验性功能。有关更多详细信息,请参阅有关lombok.configkey配置了 nullity 注释风格lombok.addNullAnnotations,则生成的equals方法以及任何canEqual方法的参数都将使用可为 null 的注释进行注释。如果您将@NonNullByDefault样式注释与严格的空值检查结合使用,则这是必需的。

https://projectlombok.org/features/EqualsAndHashCode