目录
前言:注解速查
-
@NonNull : 用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常
-
@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法
-
@Setter/@Getter : 自动生成set和get方法
-
@ToString : 自动生成toString方法
-
@EqualsAndHashcode : 从对象的字段中生成hashCode() 方法和equals()方法的实现
-
@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor
自动生成构造方法 -
@Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法
-
@Value : 用于注解final类
-
@Builder : 产生复杂的构建器api类
-
@SneakyThrows : 异常处理(谨慎使用)
-
@Synchronized : 同步方法安全的转化
-
@Getter(lazy=true) :
-
@Log: 支持各种logger对象,使用时用对应的注解,如:@Log4j
1.Lombok概念
Lombok是一个通过注解以达到减少代码的Java库,(或者说是一个插件)如通过注解的方式减少get,set方法,构造方法等。
2.安装Lombok
如何安装使用Lombok?
-
方法一
通过向lib文件夹中添加lombok.jar包即可, -
方法二 如果使用的是Maven,则可在项目的pom.xml文件中添加以下依赖:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.12</version> </dependency>
Intellij Idea 识别Lombok方法:
File->settings->Plugins->Browse repositories->Lombok
3. 使用Lombok
Lombok提供注解方式来提高代码的简洁性,常用注解有:
- 😊@Data
- @Setter @Getter
- @NonNull
- @Synchronized
- @ToString
- @EqualsAndHashCode
- @Cleanup
- @SneakyThrows
3.1 😊@Data
最常用的就是@Data注解
自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法,toString方法。
@Data=@Setter + @Getter + @ToString + @EqualsAndHashCode+@RequiredArgsConstructor
该注解相当于同时加上以下五个注解:
@Setter @Getter,@ToString,@EqualsAndHashCode@RequiredArgsConstructor,作用于类中 使用:
@Data
public class Student {
private String name;
private String address;
private String sex;
private String email;
private int age;
}
效果:
我们就可以通过类对象调用相应的get和set方法
public static void main(String[] args){
Student student=new Student();
student.setName("张三丰");
student.getName();
}
3.2 @Getter@Setter
作用于属性上,自动生成get,set方法.
public class Student {
@Getter@Setter
private String name;
}
等价源码:
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
3.3 @NonNull
@NonNull : 用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常java.lang.NullPointerException
使用方法:
public class Person {
private String name;
@Setter@Getter@NonNull
private List<Person> member;
}
源码:
@NonNull
private List<Person> members;
public Family(@NonNull final List<Person> members) {
if (members == null) throw new java.lang.NullPointerException("members");
this.members = members;
}
@NonNull
public List<Person> getMembers() {
return members;
}
public void setMembers(@NonNull final List<Person> members) {
if (members == null) throw new java.lang.NullPointerException("members");
this.members = members;
}
3.4 @Synchronized
该注解自动添加到同步机制,生成的代码并不是直接锁方法,而是锁代码块, 作用范围是方法上
使用方法:
private DateFormat t = new SimpleDateFormat("yyyy-MM-dd");
@Synchronized
public String synchronizedFormat(Date date) {
return t.format(date);
}
生成等价源码:
Object lock = new Object();
private DateFormat t = new SimpleDateFormat("yyyy-MM-dd");
public String synchronizedFormat(Date date) {
synchronized (lock) {
return t.format(date);
}
}
3.5 @ToString:自动生成toString()方法
方法我们都熟悉,但需要注意的是:@ToString
有多个属性可以进一步设置:
-
callSuper 是否输出父类的toString方法,默认为false
-
includeFieldNames 是否包含字段名称,默认为true
-
exclude 排除生成tostring的字段
@ToString(callSuper = true,exclude ={"name"})
public class Person {
private String name;
private String address;
}
等价源码:
public String toString() {
return "Person{" +
"address='" + address + '\'' +
'}';
}
3.6 @Cleanup
@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法
注释可用于确保已分配的资源被释放,如IO的连接关闭。
使用方法:
public void testCleanUp() {
try {
@Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(new byte[] {'Y','e','s'});
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
等价源码:
public void testCleanUp() {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
baos.write(new byte[]{'Y', 'e', 's'});
System.out.println(baos.toString());
} finally {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
3.7 @EqualsAndHashCode
@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集;
当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能会出现问题,如下举例:
比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。
解决方法:
-
使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。
-
使用@Getter ,@Setter @Tostring 代替 @Data 并自定义(重写) equals() 和 hashcode() 方法,比如有些类只需要判断主键 id 是否相等就够了。
参考博文:https://blog.csdn.net/u010695794/article/details/70441432