目录标题
一、lombok是什么?
lombok是一种java的使用工具,可以用来帮助开发人员消除java中的冗长代码,尤其是对于简单的java对象(pojo),他通过注解实现这一目的。
二、lombok在idea中的使用
1、需要在idea中安装lombok插件然后重启
2、在pom文件中引入对应的依赖
<!-- lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
三、lombok的常用注解
1、@Getter和@Setter
这两个注释可以注释在类上面,也可以注释在字段上面,这两个注释就是可以减少get和set方法的手动书写,当然在注释后面可以添加参数,可以说明这个字段或者类的级别,比如@Getter(AccessLevel.PROTECTED)就是说明它是protected级别的
如果在一个类上面注释了这两个注解是,可是你又希望有一个字段不会生成get和set方法是,可以在你希望不会的生成的字段上注释@Getter(AccessLevel.NONE),get同理,这个会把该字段的保护起来,不会生成这两个方法
特别注意的是如果一个字段有静态修饰词static是不会生成这两个方法,还是final修饰时,不会生成set方法。
下面是.java文件以及生成的.class文件
.java文件
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
/**
* @author weiguorong
* @date 2021/2/12 16:22
*/
@Getter
@Setter
public class Student {
static int id;
final int id2 = 10;
private String name;
@Setter(AccessLevel.PRIVATE)
private String sex;
@Setter(AccessLevel.NONE)
@Getter(AccessLevel.NONE)
private String email;
}
生成的.class文件
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
public class Student {
static int id;
final int id2 = 10;
private String name;
private String sex;
private String email;
public Student() {
}
public int getId2() {
this.getClass();
return 10;
}
public String getName() {
return this.name;
}
public String getSex() {
return this.sex;
}
public void setName(String name) {
this.name = name;
}
private void setSex(String sex) {
this.sex = sex;
}
}
2、@ToString
这个注解不支持在字段上,只能在类上,顾名思义就是生成toSting方法,在这边要注意的是该注解的有两种参数,exclude和of
用法如下@ToString(exclude = {“email”},of = {“name”}),exclude是除了大括号里的值,其他都有,而of只有大括号里的值
3、@EqualsAndHashCode
这个注解生成了equals、canEqual、hashCode三个方法,它个@ToString一样有exclude和of两个参数,用法也跟它一样
4、@NonNull
@NonNull这个注解可以用在字段上,也可以用在方法的参数上,作用是自动帮你判断是否是null,如果是null,就会报空指针异常,
5、@NoArgsConstructor、@RequiredArgsConstructor和@AllArgsConstructor
这三个注解都是生成构造函数的,@NoArgsConstructor是无参的构造函数,
@RequiredArgsConstructor是构造有@NonNull修饰的字段或者是final修饰的字段的构造方法,@AllArgsConstructor则是所有的字段的构造函数
6、@Data
@Data注解集成了@Getter和@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor这几个注解与一身,是一个非常强大的注解,这个注解更可以简化注解的代码量
7、@Builder
@Builder注解会生成一个Builder内部类,使用的赋值操作会比之前更加方便,具体我把代码放下面
.java文件
import lombok.*;
/**
* @author weiguorong
* @date 2021/2/12 16:22
*/
@Data
@Builder
public class Student {
static int id;
final int id2 = 10;
private String name;
@Setter(AccessLevel.PRIVATE)
private String sex;
@Setter(AccessLevel.NONE)
@Getter(AccessLevel.NONE)
private String email;
public static void main(String[] args) {
Student student = Student.builder()
.email("123")
.sex("男")
.name("萧炎")
.build();
System.out.println(student.toString());
}
}
生成的.class文件
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
public class Student {
static int id;
final int id2 = 10;
private String name;
private String sex;
private String email;
public static void main(String[] args) {
Student student = builder().email("123").sex("男").name("萧炎").build();
System.out.println(student.toString());
}
Student(String name, String sex, String email) {
this.name = name;
this.sex = sex;
this.email = email;
}
public static Student.StudentBuilder builder() {
return new Student.StudentBuilder();
}
public int getId2() {
this.getClass();
return 10;
}
public String getName() {
return this.name;
}
public String getSex() {
return this.sex;
}
public void setName(String name) {
this.name = name;
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof Student)) {
return false;
} else {
Student other = (Student)o;
if (!other.canEqual(this)) {
return false;
} else if (this.getId2() != other.getId2()) {
return false;
} else {
label49: {
Object this$name = this.getName();
Object other$name = other.getName();
if (this$name == null) {
if (other$name == null) {
break label49;
}
} else if (this$name.equals(other$name)) {
break label49;
}
return false;
}
Object this$sex = this.getSex();
Object other$sex = other.getSex();
if (this$sex == null) {
if (other$sex != null) {
return false;
}
} else if (!this$sex.equals(other$sex)) {
return false;
}
Object this$email = this.email;
Object other$email = other.email;
if (this$email == null) {
if (other$email != null) {
return false;
}
} else if (!this$email.equals(other$email)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(Object other) {
return other instanceof Student;
}
public int hashCode() {
int PRIME = true;
int result = 1;
int result = result * 59 + this.getId2();
Object $name = this.getName();
result = result * 59 + ($name == null ? 43 : $name.hashCode());
Object $sex = this.getSex();
result = result * 59 + ($sex == null ? 43 : $sex.hashCode());
Object $email = this.email;
result = result * 59 + ($email == null ? 43 : $email.hashCode());
return result;
}
public String toString() {
return "Student(id2=" + this.getId2() + ", name=" + this.getName() + ", sex=" + this.getSex() + ", email=" + this.email + ")";
}
private void setSex(String sex) {
this.sex = sex;
}
public static class StudentBuilder {
private String name;
private String sex;
private String email;
StudentBuilder() {
}
public Student.StudentBuilder name(String name) {
this.name = name;
return this;
}
public Student.StudentBuilder sex(String sex) {
this.sex = sex;
return this;
}
public Student.StudentBuilder email(String email) {
this.email = email;
return this;
}
public Student build() {
return new Student(this.name, this.sex, this.email);
}
public String toString() {
return "Student.StudentBuilder(name=" + this.name + ", sex=" + this.sex + ", email=" + this.email + ")";
}
}
}
注意看.java文件的mian方法中的赋值,这样的链式赋值相比之前更方便简洁,控制台的输出如下:
8、@Log
@Log注解也是简化了日志,可以通过注解直接获取到日志
9、val
这不是一个注解,它就相当于前端的var一样,比如java中本来书写的Map<String,String> map = new HashMap<String,String>();可以书写成val map = new HashMap<String,String>();虽然是这样书写的,但是最后生成的类型还是Map<String,String>
10、@Cleanup
该注解标记与文件流对象上,可以解决文件流对象对异常的捕捉和文件流的关闭的繁琐代码