提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 1 Lombok介绍
- 1.1 Lombok是什么?
- 1.2 如何安装Lombok?
- 2 Lombok注解
- 2.1 @Getter@Setter
- 2.2 @ToString
- 2.3 @EqualsAndHashCode
- 2.4 @NoArgsConstructor , @RequiredArgsConstructor ,@AllArgsConstructor
- @NoArgsConstructor
- @RequiredArgsConstructor
- @AllArgsConstructor
- 2.5 @Data
- 2.6 @NonNull
- 3.其他注解大全
1 Lombok介绍
1.1 Lombok是什么?
Lombok是一个通过注解以达到减少代码的Java库,如通过注解的方式减少get,set方法,构造方法等。
- 使用LomBok之前
- 使用LomBok之后
1.2 如何安装Lombok?
方法一
- 通过向lib文件夹中添加lombok.jar包即可,
方法二 如果使用的是Maven,则可在项目的pom.xml文件中添加以下依赖:
- 1、普通maven项目Lombok依赖为:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
- 2、SpringBoot项目Lombok的引入方式为:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2 Lombok注解
Lombok提供注解方式来提高代码的简洁性,常用注解有:
- @Data
- @Setter @Getter
- @NonNull
- @Synchronized
- @ToString
- @EqualsAndHashCode
- @Cleanup
- @SneakyThrows
2.1 @Getter@Setter
作用:为类中的属性提供setter/getter方法
位置:类上方或属性上方,在属性上方则为属性生成setter/getter 方法,在类上方表示给该类下的所有属性生成setter/getter方法
属性:设置setter和getter访问权限
//给类下的所有属性添加Setter/Getter
@Setter
@Getter
public class User {
//给id属性添加Setter
@Setter
private Integer id;
//给username的setter方法设置私有权限
@Setter(AccessLevel.PRIVATE)
private String username;
//取消password的Getter方法
@Getter(AccessLevel.NONE)
private String password;
private static int age;
private final String address = null;
}
注:
- static修饰的变量不生成getter和setter方法
- final修饰的变量只生成getter方法
在IDEA中,按住 Alt+7 可以查看Lombok生成的代码
2.2 @ToString
作用:生成toString方法,默认情况下它会按顺序打印类名称以及 每个字段。
位置:类上方
@ToString有多个属性可以进一步设置:
- callSuper 是否输出父类的toString方法,默认为false
- includeFieldNames 是否包含字段名称,默认为true
- exclude 排除生成tostring的字段
@Setter
@Getter
//给User2设置一个toString方法,该方法不会显示password的值
@ToString(exclude = {"password"})
public class User2 {
private Integer id;
private String username;
private String password;
}
2.3 @EqualsAndHashCode
作用:生成equals和hashCode、canEqual方法。用于比较两个类 对象是否相同。
位置:类上方
属性:
- exclude: 比较时排除一些属性
- of: 比较时只使用一些属性
@Setter
@Getter
@ToString
//@EqualsAndHashCode(exclude = {"password"})
//排除password,只使用id,username对比及计算hash
@EqualsAndHashCode(of = {"username"})
//只使用username对比及计算hash
public class User3 {
private Integer id;
private String username;
private String password;
}
2.4 @NoArgsConstructor , @RequiredArgsConstructor ,@AllArgsConstructor
@NoArgsConstructor
生成无参构造方法
@RequiredArgsConstructor(staticName = "newInstance",
access = AccessLevel.PROTECTED,
onConstructor_ = {@Deprecated})
public class ChengXiao {
private String name;
private final int age;
@NonNull
private String phone;
}
@RequiredArgsConstructor
生成包含final和@NonNull修饰的属性的构造方法
@RequiredArgsConstructor(staticName = "newInstance", access = AccessLevel.PROTECTED, onConstructor_ = {@Deprecated})
public class ChengXiao {
private String name;
private final int age;
@NonNull
private String phone;
}
温馨提示
- 当类中没有 final 和 @NonNull 注解的成员变量时会生成一个无参构造方法(因为没有符合要求的参数),而很多人认为 @Data会生成无参构造方法就是此导致的
@AllArgsConstructor
生成全参的构造方法
@Setter
@Getter
//@NoArgsConstructor // 给类提供无参构造方法
@RequiredArgsConstructor // 生成两个username和sex参数的构造方法
@AllArgsConstructor//提供全参构造方法
public class User5 {
@NonNull
private Integer id;
private String username;
private String password;
private final String sex;
}
2.5 @Data
相当于同时添加
@Setter、
@Getter、
@ToString、
@EqualsAndHashCode、
@RequiredArgsConstructor 五个注解
@Data(staticConstructor = "newInstance")
public class Yoona {
private String nname;
public final static int age = 18;
@NonNull private String address;
}
编译后
public class Yoona {
private String nname;
public static final int age = 18;
@NonNull
private String address;
private Yoona(@NonNull String address) {
if (address == null)
throw new NullPointerException("address is marked non-null but is null");
this.address = address;
}
public static Yoona newInstance(@NonNull String address) {
return new Yoona(address);
}
/** ---------- setter、getter toString等方法省略 ---------- **/
2.6 @NonNull
作用:用于方法参数前,表示调用该方法时参数不能为null;用于属性上方,表示为该属性赋值时值不能为null。
位置:方法参数前或属性上方。
@Setter
@Getter
public class User4 {
// 调用构造方法或setter给id赋值时,值不能为null
@NonNull
private Integer id;
private String username;
private String password;
// 调用sleep方法时,time参数不能为null
public void sleep(@NonNull Integer time)
{
System.out.println("睡觉");
}
}
// 测试
@SpringBootTest
public class UserTest {
@Test
public void testUser() {
User4 user = new User4();
user.setId(null);
user.sleep(null);
}
}
3.其他注解大全