使用Lombok优化代码
簡介
Lombok項目是一個Java庫,Lombok提供了一組有用的注釋,用來消除Java類中的大量樣板代碼,簡潔且易于維護的Java類。
使用工具
IDEA2018.2 MySQL5.6 JDK1.8
使用jar包
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version><scope>provided</scope> </dependency>環境搭建
請參照
https://blog.csdn.net/qq_44989881/article/details/102702027
進行項目配置
代碼示例
優化Student.java代碼
Student.java
package com.vvcat.gitee.bean;import lombok.*;import javax.persistence.*;/*** @ToString(callSuper=true,exclude="someExcludedField")* 類使用@ToString注解,Lombok會生成一個toString()方法,默認情況下,會輸出類名、所有屬性(會按照屬性定義順序),用逗號來分割。* 通過將includeFieldNames參數設為true,就能明確的輸出toString()屬性。** @RequiredArgsConstructor(staticName = "Student")* 注解在類上,會生成構造方法(可能帶參數也可能不帶參數)。* 注意:如果帶參數,這參數只能是以 final 修飾的未經初始化的字段或者是以 @NonNull 注解的未經初始化的字段。* 該注解還可以用 @RequiredArgsConstructor(staticName="methodName") 的形式生成一個指定名稱的靜態方法,返回一個調用相應的構造方法產生的對象** @NonNull* 該注解用在屬性或構造器上,Lombok會生成一個非空的聲明,可用于校驗參數,能幫助避免空指針。*/@Entity @Table(name = "student")//數據庫表明 @ToString(callSuper=true,exclude="age",includeFieldNames = true) //使用lombok 重寫toSting方法 默認的toString格式 @NoArgsConstructor //無參構造器 @RequiredArgsConstructor(staticName = "Student") //部分參數構造器 @AllArgsConstructor(access = AccessLevel.PROTECTED) //全參構造器 public class Student {@Id//聲明id為主鍵@Setter //為代碼添加Setter方法@Getter //為代碼添加Getter方法@GeneratedValue(strategy = GenerationType.IDENTITY)//聲明自動增長@Column(name = "id")//聲明數據庫對應的字段private Integer id;@NonNull //使用@NonNull注解,指定 stuName 為構造方法中的參數@Setter //為代碼添加Setter方法@Getter //為代碼添加Getter方法@Column(name = "stuName")//聲明數據庫對應的字段//定義字段也是有講究的,比如首字母小寫,后邊的駝峰,對應的數據庫字段,遇到駝峰用下劃線斷開//比如實體類定義的userName,則數據庫字段為user_name,//比如實體類定義的username,則數據庫字段也為usernameprivate String stu_name;@NonNull //使用@NonNull注解,指定 age 為構造方法中的參數@Setter //為代碼添加Setter方法@Getter //為代碼添加Getter方法@Column(name = "age")//聲明數據庫對應的字段private Integer age;@NonNull //使用@NonNull注解,指定 sex 為構造方法中的參數@Setter //為代碼添加Setter方法@Getter //為代碼添加Getter方法@Column(name = "sex")//聲明數據庫對應的字段private String sex;}使用說明
1. @ToString注解
- @ToString(callSuper=true,exclude=“age”)
- 類使用@ToString注解,Lombok會生成一個toString()方法,默認情況下,會輸出類名、所有屬性(會按照屬性定義順序),用逗號來分割。
-
- 通過將includeFieldNames參數設為true,就能明確的輸出toString()屬性。
@ToString注解的使用可以代替快捷鍵Alt + Insert中ToString方法的生成
快捷鍵Alt + Insert生成的ToString方法:
@Overridepublic String toString() {return "Student{" +"id=" + id +", stu_name='" + stu_name + '\'' +", age=" + age +", sex='" + sex + '\'' +'}';}:
使用@ToString注解生成的ToString方法:
public String toString() {return "Student(super=" + super.toString() + ", id=" + this.getId() + ", stu_name=" + this.getStu_name() + ", age=" + this.getAge() + ", sex=" + this.getSex() + ")"; }2. @Setter和@Getter注解
@Setter和@Getter注解 的使用可以代替快捷鍵Alt + Insert中Setter和Getter方法的生成
快捷鍵Alt + Insert生成的Setter和Gette方法:
使用@Setter和@Getter注解生成的Setter和Getter方法:
public void setStu_name(String stu_name) {this.stu_name = stu_name; }public String getStu_name() {return this.stu_name; }在 private String stu_name; 添加@Setter和@Getter注解后再添加@NonNull注解
@NonNull //使用@NonNull注解,指定 stuName 為構造方法中的參數 @Setter //為代碼添加Setter方法 @Getter //為代碼添加Getter方法 @Column(name = "stuName")//聲明數據庫對應的字段 private String stu_name;生成的Setter和Getter方法:
public void setStu_name(@NonNull String stu_name) {if (stu_name == null) {throw new NullPointerException("stu_name");} else {this.stu_name = stu_name;} }@NonNull public String getStu_name() {return this.stu_name; }@NonNull 該注解用在屬性或構造器上,Lombok會生成一個非空的聲明,可用于校驗參數,能幫助避免空指針。
3. @NoArgsConstructor注解
@NoArgsConstructor注解 的使用可以代替快捷鍵Alt + Insert中Constructor方法的生成
快捷鍵Alt + Insert生成的Constructor方法:
使用@NoArgsConstructor注解生成的Constructor方法:
public Student() { }4. @RequiredArgsConstructor注解
- @RequiredArgsConstructor(staticName = “Student”)
- 注解在類上,會生成構造方法(可能帶參數也可能不帶參數)。
- 注意:如果帶參數,這參數只能是以 final 修飾的未經初始化的字段或者是以 @NonNull 注解的未經初始化的字段。
使用@RequiredArgsConstructor 需要在封裝的屬性上添加@NonNull注解
例如(下面例子中沒有為id 添加 @NonNull )
@RequiredArgsConstructor注解 的使用可以代替快捷鍵Alt + Insert中Constructor方法的生成
快捷鍵Alt + Insert生成的Constructor方法:
使用@RequiredArgsConstructor注解生成的Constructor方法:
private Student(@NonNull String stu_name, @NonNull Integer age, @NonNull String sex) {if (stu_name == null) {throw new NullPointerException("stu_name");} else if (age == null) {throw new NullPointerException("age");} else if (sex == null) {throw new NullPointerException("sex");} else {this.stu_name = stu_name;this.age = age;this.sex = sex;} }- 該注解還可以用 @RequiredArgsConstructor(staticName=“methodName”) 的形式生成一個指定名稱的靜態方法,返回一個調用相應的構造方法產生的對象
例如:
使用@RequiredArgsConstructor注解生成的Constructor方法:
public static Student Test(@NonNull String stu_name, @NonNull Integer age, @NonNull String sex) {return new Student(stu_name, age, sex); }5. @AllArgsConstructor注解
@AllArgsConstructor注解 的使用可以代替快捷鍵Alt + Insert中Constructor方法的生成
快捷鍵Alt + Insert生成的Constructor方法:
使用@AllArgsConstructor注解生成的Constructor方法:
@ConstructorProperties({"id", "stu_name", "age", "sex"}) protected Student(Integer id, String stu_name, Integer age, String sex) {this.id = id;this.stu_name = stu_name;this.age = age;this.sex = sex; }在屬性上添加上@NonNull注解后,使用@AllArgsConstructor注解生成的Constructor方法:
@ConstructorProperties({"id", "stu_name", "age", "sex"}) protected Student(Integer id, @NonNull String stu_name, @NonNull Integer age, @NonNull String sex) {if (stu_name == null) {throw new NullPointerException("stu_name");} else if (age == null) {throw new NullPointerException("age");} else if (sex == null) {throw new NullPointerException("sex");} else {this.id = id;this.stu_name = stu_name;this.age = age;this.sex = sex;} }6.@NonNull注解
該注解用在屬性或構造器上,Lombok會生成一個非空的聲明,可用于校驗參數,能幫助避免空指針。
7.@Data注解
@Data注解在 類 上;提供類所有屬性的 get 和 set 方法,此外還提供了equals、canEqual、hashCode、toString 方法。
在使用注解時的代碼:
import lombok.*; import javax.persistence.*;@Entity @Table(name = "student")//數據庫表明 @Data //使用Data注解 public class Student {@Id//聲明id為主鍵@GeneratedValue(strategy = GenerationType.IDENTITY)//聲明自動增長@Column(name = "id")//聲明數據庫對應的字段private Integer id;@Column(name = "stuName")//聲明數據庫對應的字段private String stu_name;@Column(name = "age")//聲明數據庫對應的字段private Integer age;@Column(name = "sex")//聲明數據庫對應的字段private String sex;}使用@Data注解編譯后自動生成的代碼:
import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table;@Entity @Table(name = "student" ) public class Student {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id")private Integer id;@Column(name = "stuName")private String stu_name;@Column(name = "age")private Integer age;@Column(name = "sex")private String sex;public Student() {}public Integer getId() {return this.id;}public String getStu_name() {return this.stu_name;}public Integer getAge() {return this.age;}public String getSex() {return this.sex;}public void setId(Integer id) {this.id = id;}public void setStu_name(String stu_name) {this.stu_name = stu_name;}public void setAge(Integer age) {this.age = age;}public void setSex(String sex) {this.sex = sex;}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 {label59: {Object this$id = this.getId();Object other$id = other.getId();if (this$id == null) {if (other$id == null) {break label59;}} else if (this$id.equals(other$id)) {break label59;}return false;}Object this$stu_name = this.getStu_name();Object other$stu_name = other.getStu_name();if (this$stu_name == null) {if (other$stu_name != null) {return false;}} else if (!this$stu_name.equals(other$stu_name)) {return false;}Object this$age = this.getAge();Object other$age = other.getAge();if (this$age == null) {if (other$age != null) {return false;}} else if (!this$age.equals(other$age)) {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;}return true;}}}protected boolean canEqual(Object other) {return other instanceof Student;}public int hashCode() {int PRIME = true;int result = 1;Object $id = this.getId();int result = result * 59 + ($id == null ? 43 : $id.hashCode());Object $stu_name = this.getStu_name();result = result * 59 + ($stu_name == null ? 43 : $stu_name.hashCode());Object $age = this.getAge();result = result * 59 + ($age == null ? 43 : $age.hashCode());Object $sex = this.getSex();result = result * 59 + ($sex == null ? 43 : $sex.hashCode());return result;}public String toString() {return "Student(id=" + this.getId() + ", stu_name=" + this.getStu_name() + ", age=" + this.getAge() + ", sex=" + this.getSex() + ")";} }其它注解
@Log4j
@EqualsAndHashCode
@Cleanup
@Value
@SneakyThrows
@Synchronized
目前剛開始接觸,還未使用到,日后用到之后,再進行補充說明
總結
以上是生活随笔為你收集整理的使用Lombok优化代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringDataJpa框架单元测试实
- 下一篇: 使用SpringBoot框架和Sprin