文章目录
《Lombok 实战 —— @toString & @EqualsAndHashCode》
1. @toString
No need to start a debugger to see your fields: Just let lombok generate a
toString
for you!
1.1 入门使用@toString
任何类定义都可以用@ToString
注释,让lombok
生成toString()
方法的实现。 默认情况下,它会按顺序打印类名和每个字段,并以逗号分隔,如下所示:
@Getter
@Setter
@ToString
public class User {
private String username;
private String password;
private boolean isAdult;
}
// 编译后:
public class User {
private String username;
private String password;
private boolean isAdult;
// 其他省略
public String toString() {
return "User(username=" + this.getUsername() +
", password=" + this.getPassword() +
", isAdult=" + this.isAdult() + ")";
}
}
在编译后地结果中可以看到,lombok
默认使用的是getter
方法进行设值,如this.getUsername()
,但是我们实际并不需要通过getter
的方式进行设置,lombok
也知道我们有这样的需求,为我们提供了注解配置项,下面我们就来继续看看如何进行更个性化的配置@toString
。
1.2 深度研究@toString
深度研究一个东西,肯定少不了源码的分析,当然@toString
的代码并不难,放一百个心,如下所示:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface ToString {
// 输出是否带字段名称
boolean includeFieldNames() default true;
// 排除字段,以 String[] 格式设置
String[] exclude() default {
};
// 指定输出哪些字段,不过将来会被标注@deprecated,使用 @ToString.Include 替代
String[] of() default {
};
// 是否调用父类的 toString() 方法
boolean callSuper() default false;
// 不使用 getter 方法获取字段值
boolean doNotUseGetters() default false;
// 是否只输出被 @ToString.Include 备注的属性,默认情况输出所有非静态字段
boolean onlyExplicitlyIncluded() default false;
// 标注不被输出的字段
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Exclude {
}
// 标注被输出的字段 @ToString.Include
@Target({
ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)