一.介绍
Project Lombok 是一个 Java 库,它会自动插入编辑器和构建工具,为您的 Java 增添趣味。永远不要再写另一个 getter 或 equals 方法,使用一个注释,您的类有一个功能齐全的构建器,自动化您的日志记录变量等等。
二.添加Lombok依赖
1.pom文件中添加
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
2.创建项目中勾选Lombok选项,pom文件中自动生成
三.优缺点
优点: 通过注解的形式自动生成构造器,简化代码,例如在做属性修改的时候不用做
过多的处理
缺点:不支持多种参数构造器的重载
四.常用注解
@Data
使用该注解可以自动生成Getter、Setter、equals、hashCode和toString方法,相当于同时使用了
这些方法
@Getter
自动生成Java Bean类的Getters方法(访问实体类的属性)
@Setter
自动生成Java Bean类的Setter方法(访问实体类的属性)
@ToString
可以自动生成ToString方法(将一个对象的属性转换成一个字符串,方便输出调试信息。)
@EqualsAndHashCode
@EqualsAndHashCode注解可以自动生成equals和hashCode方法(可以用来比较两个对象是否相等。)
综上@Data包含如上述注解,如果其他注解默认使用的话,就可以直接使用@Data
对于@EqualsAndHashCode注解有两种写法
@EqualsAndHashCode(callSuper = false)和@EqualsAndHashCode(callSuper = ture)
前者默认就是不管父类继承的属性的,后者是用自己的属性和从父类继承的属性 来生成hashcode
使用@Data注解
package com.haxlab.server.entity; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import lombok.extern.slf4j.Slf4j; @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @Table("t_student") public class Student { @Id(keyType = KeyType.Auto) private long id; private String name; private String gender; private int score; private String grade; }
通过这个注解,不用在写Getter和Setter方法,就能访问实体类里的属性
也不用在写equals、hashCode和toString方法
不使用Data注解
package com.haxlab.server.entity; import com.mybatisflex.annotation.Id; import com.mybatisflex.annotation.KeyType; import com.mybatisflex.annotation.Table; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @Table("t_student") public class Student { @Id(keyType = KeyType.Auto) private long id; private String name; private String gender; private int score; private int grade; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } public boolean equals(Object object) { if (this == object) return true; if (!(object instanceof Student)) return false; if (!super.equals(object)) return false; Student student = (Student) object; return getId() == student.getId() && getScore() == student.getScore() && getGrade() == student.getGrade() && java.util.Objects.equals(getName(), student.getName()) && java.util.Objects.equals(getGender(), student.getGender()); } public int hashCode() { return java.util.Objects.hash(super.hashCode(), getId(), getName(), getGender(), getScore(), getGrade()); } @java.lang.Override public java.lang.String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + ", gender='" + gender + '\'' + ", score=" + score + ", grade=" + grade + '}'; } }
如果要修改实体类某个属性的时候,不使用@Data注解,修改过程会相对很麻烦
@AllArgsConstructor和@NoArgsConstructor
@AllArgsConstructor生成全参构造法
@NoArgsConstructor生成无参数构造法
@Data @AllArgsConstructor @NoArgsConstructor public class User { private int id; private String name; private int age; }
等价于
@Data public class User { private int id; private String name; private int age; public User() { } public User(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } }