@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
Lombok是一个通过注解以达到减少代码的Java库,(或者说是一个插件)如通过注解的方式减少get,set方法,构造方法等。
如何安装使用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
Lombok提供注解方式来提高代码的简洁性,常用注解有:
最常用的就是@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();
}
作用于属性上,自动生成get,set方法.
public class Student {
@Getter@Setter
private String name;
}
等价源码:
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@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;
}
该注解自动添加到同步机制,生成的代码并不是直接锁方法,而是锁代码块, 作用范围是方法上
使用方法:
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);
}
}
方法我们都熟悉,但需要注意的是:@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 + '\'' +
'}';
}
@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();
}
}
@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