目录
@AllArgsConstructor、@NoArgsConstructor、@RequiredArgsConstructor
使用方法
在pom文件中添加,具体version版本,可以参考maven版本库的中lombok信息。可以查看目前已有的版本,可以选择使用较多的新版本即可。注意:一定要指定版本,如果不指定会使用最新版本,有可能由于版本不稳定造成各种奇奇怪怪的问题。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
@Slf4j与@Log4j
二者都注解类,可用于打印日志,但是更推荐使用@Slf4j。原因如下,详细的化推荐看《SLF4J使用和与Log4J对比》
- @Log4j是具体的日志实现。而@Slf4j是一个抽象层,它允许程序使用任意一个日志类库,使程序更加独立。
- @Slf4j可以使用占位符"{}",可减少代码中字符串连接次数
下面举个例子
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class ApplicationMain {
public static void main(String[] args) {
int i = 10;
log.info("打印出来{}", i); //占位符的使用
}
}
@AllArgsConstructor、@NoArgsConstructor、@RequiredArgsConstructor
这三个都在用于注解类,表示自动生成此类的构造器。@AllArgsConstructor(包含所有参数的构造器)、@NoArgsConstructor(无参构造器)、@RequiredArgsConstructor(构造器只包含被final修饰的变量)。
正常情况下,是不需要@NoArgsConstructor的,因为如果不手动建立一个构造函数,系统会为一个类建立一个无参构造器。但是,如果手动建立一个非无参的构造函数,就需要@NoArgsConstructor了。同理,如果我们使用@AllArgsConstructor,最好再加上@NoArgsConstructor。
@NoArgsConstructor和@RequiredArgsConstructor的使用会产生冲突。按情况分析:
- 如果类中无final修饰的变量,@RequiredArgsConstructor会构建无参的构造函数
- 如果类中有final修饰的变量,且直接赋初始值,@RequiredArgsConstructor会构建无参的构造函数
- 如果类中有final修饰的变量,但没有直接赋初始值,构造函数中至少要包括全部的final修饰的变量,不可构建无参的构造函数。
举个例子
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class User{
private final String name="";
private String id;
}
我们看一下反编译的结果:
package com.springboot.Entity;
public class User {
private final String name = "";
private Integer id;
public User() {
}
}
@Data
用于注解类,相当于同时加了如下五个注解
- @Getter 所有变量的get方法
- @Setter 所有变量的set方法
- @ToString 输出这个变量的示例时,直接调用toString方法,输出所有变量的值
- @EqualsAndHashCode 判等时使用,相当于同时加了equal和hashCode两个方法
- @RequiredArgsConstructor 前面介绍过
如果@Data与@RequiredArgsConstructor加在类上,也不会产生冲突,只是会有代码的冗余。举个例子。
import lombok.Data;
@Data
public class User{
private final String name="";
private Integer id;
}
我们看一下反编译的结果:
public class User {
private final String name = "";
private Integer id;
public User() {
}
public String getName() {
this.getClass();
return "";
}
public Integer getId() {
return this.id;
}
public void setId(final Integer id) {
this.id = id;
}
public boolean equals(final Object o) {
if (o == this) {
return true;
} else if (!(o instanceof User)) {
return false;
} else {
User other = (User)o;
if (!other.canEqual(this)) {
return false;
} else {
Object this$name = this.getName();
Object other$name = other.getName();
if (this$name == null) {
if (other$name != null) {
return false;
}
} else if (!this$name.equals(other$name)) {
return false;
}
Object this$id = this.getId();
Object other$id = other.getId();
if (this$id == null) {
if (other$id != null) {
return false;
}
} else if (!this$id.equals(other$id)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(final Object other) {
return other instanceof User;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $name = this.getName();
int result = result * 59 + ($name == null ? 43 : $name.hashCode());
Object $id = this.getId();
result = result * 59 + ($id == null ? 43 : $id.hashCode());
return result;
}
public String toString() {
return "User(name=" + this.getName() + ", id=" + this.getId() + ")";
}
}