@EqualsAndHashCode 注解用于自动生成 equals() 和 hashCode() 方法。
Lombok 的原理是通过编译时注解处理器来实现的。当你使用 @EqualsAndHashCode 注解时,编译器会在编译过程中检测到这个注解,并生成对应的 equals() 和 hashCode() 方法的代码。这样,你就不需要手动编写这些方法,而是让 Lombok 自动生成。
@EqualsAndHashCode 注解
@EqualsAndHashCode 是 Lombok 提供的一个注解,用于自动生成 Java 类中的 equals() 和 hashCode() 方法,以便比较对象的内容是否相等和生成哈希码。
源码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface EqualsAndHashCode {
String[] exclude() default {};
String[] of() default {};
boolean callSuper() default false;
boolean doNotUseGetters() default false;
CacheStrategy cacheStrategy() default CacheStrategy.NEVER;
AnyAnnotation[] onParam() default {};
@Deprecated
@Retention(RetentionPolicy.SOURCE)
@Target({})
@interface AnyAnnotation {}
boolean onlyExplicitlyIncluded() default false;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Exclude {}
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Include {
String replaces() default "";
int rank() default 0;
}
public enum CacheStrategy {
NEVER,
LAZY
}
}
作用
@EqualsAndHashCode 的主要作用是简化 Java 类的编写,特别是在需要比较对象内容或使用对象作为 Map 的键时,自动生成 equals() 和 hashCode() 方法可以减少样板代码的编写。
注解属性
@EqualsAndHashCode 注解有一些属性,可以用来自定义生成的 equals() 和 hashCode() 方法的行为。
以下是一些常用的属性:
exclude:用于排除指定字段不参与equals()和hashCode()的生成。of:用于指定哪些字段参与equals()和hashCode()的生成,只有这些字段会被考虑。callSuper:默认为false,如果设置为true,生成的equals()和hashCode()方法会调用父类的方法。doNotUseGetters:默认为false,如果设置为true,生成的equals()和hashCode()方法会直接访问字段,而不使用 getter 方法。
用法
要使用 @EqualsAndHashCode 注解,只需将其添加到类的定义上,如下所示:
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class Person {
private String name;
private int age;
}
在这个示例中,@EqualsAndHashCode 注解被应用于 Person 类,它将自动生成 equals() 和 hashCode() 方法,这些方法将基于 name 和 age 字段进行比较和哈希计算。
你还可以使用注解的属性来自定义生成的方法,例如:
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(exclude = "age")
public class Person {
private String name;
private int age;
}
在这个示例中,age 字段被排除在 equals() 和 hashCode() 的生成之外。
总结
总之,@EqualsAndHashCode 注解是 Lombok 的一项功能,它用于自动生成 Java 类中的 equals() 和 hashCode() 方法,从而简化了对象比较和哈希计算的代码编写。你可以使用注解属性来自定义生成的方法的行为,使其满足你的需求。这个功能的实现是通过编译时注解处理器来完成的,不需要运行时的代码。