1. 什么是lombok
官網(wǎng)原話 :
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Lombk是一個java庫 , 它可以自動注入到你的編輯器與構(gòu)建工具中 , 從而對java進行增強 .
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
通過一個注解 , 你的類就即可獲得一個功能齊全的構(gòu)建器 , 不用再重寫
getter
和equals
方法(自動生成) , 以及會自動為你生成一個用于記錄日志的logger變量 與 其他更多功能 圆米。
總的來說 , lombok就是一個java庫 , 可以通過使用lombok提供的注解 , 從而可以省略一些重復代碼的編寫 , 例如getter , setter , equals 等方法的編寫. 添加相關(guān)注解之后 , 會在編譯階段自動為我們生成 , 從而提高了代碼可讀性.
2. 使用準備
Maven項目中引入如下依賴 :
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
視情況還需要在IDE中安裝lombok的插件 (這里以IDEA為例) :
安裝完重啟IDEA , 勾選如下配置 :
3. 常用注解解析
@NotNull
作用 : 避免空指針異常 , 當被標識的變量為null時 , 會自動拋出
NullPointerException
作用位置 : 成員變量 , 方法形參
-
代碼示例 :
使用
@NotNull
:@Getter @Setter @NonNull private List<Person> members;
等價的java源代碼 :
@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; } //上面Members屬性同時使用了@NotNull與@Setter,相當于在setter方法中在形參前添加@NotNull注解 //在形參前添加@NotNull相當于對形參進行空值判斷 public void setMembers(@NonNull final List<Person> members) { if (members == null) { throw new java.lang.NullPointerException("members"); } this.members = members; }
@Cleanup
作用 : 自動幫我們調(diào)用資源對象的
close()
方法作用位置 : 資源對象變量上
-
代碼示例 :
使用
@Cleanup
注解 :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(); } }
等價的java源代碼 :
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(); } }
@Getter & @Setter
-
作用 :
-
@Getter
: 生成對應的getter方法 -
@Setter
: 生成對應的setter方法
-
作用位置 : 成員變量上
-
代碼示例 :
使用
@Getter
與@Setter
:@Getter @Setter private boolean employed = true; @Setter(AccessLevel.PROTECTED) private String name; // AccessLevel.PROTECTED指定生成的構(gòu)造方法的權(quán)限修飾符為protected
等價的java源代碼 :
private boolean employed = true; private String name; public boolean isEmployed() { return employed; } public void setEmployed(final boolean employed) { this.employed = employed; } protected void setName(final String name) { this.name = name; }
@EqualsAndHashCode
-
作用 : 根據(jù)成員變量生成
equals()
與hashCode()
- 作用位置 : 類上
-
常用屬性 :
-
exclude
: 指定要排除的屬性 ; -
of
: 指定根據(jù)哪些屬性生成equals()
與hashCode()
方法; -
callSuper
: 該值為true
時 , 生成的equals()
與hashCode()
調(diào)用父類的equals()
與hashCode()
方法 , 默認值為false
;
-
@NoArgsConstructor & @AllArgsConstructor & @RequiredArgsConstructor
-
作用 :
-
@NoArgsConstructor
: 自動生成無參構(gòu)造方法 ; -
@AllArgsConstructor
: 自動生成全參的構(gòu)造方法 ; -
@RequiredArgsConstructor
: 對標識了@NotNull
或者是final
關(guān)鍵字的成員變量生成權(quán)限為private
的構(gòu)造方法 , 如何想要對外提供使用可以指定staticName
屬性生成一個static方法 ;
-
作用位置 : 均在類上
-
代碼示例 :
使用lombok注解 :
import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.AllArgsConstructor; import lombok.NonNull; @RequiredArgsConstructor(staticName = "of") //生成一個static方法,方法名為of @AllArgsConstructor(access = AccessLevel.PROTECTED) public class ConstructorExample<T> { private int x, y; @NonNull private T description; @NoArgsConstructor public static class NoArgsExample { @NonNull private String field; } }
等價的java源碼 :
public class ConstructorExample<T> { private int x, y; @NonNull private T description; private ConstructorExample(T description) { if (description == null) throw new NullPointerException("description"); this.description = description; } public static <T> ConstructorExample<T> of(T description) { return new ConstructorExample<T>(description); } @java.beans.ConstructorProperties({"x", "y", "description"}) protected ConstructorExample(int x, int y, T description) { if (description == null) throw new NullPointerException("description"); this.x = x; this.y = y; this.description = description; } public static class NoArgsExample { @NonNull private String field; public NoArgsExample() { } } }
@Data
作用 : 自動為所有字段添加
@ToString
,@EqualsAndHashCode
,@Getter
方法售葡,為<font style="color:red">非final字段 </font>添加@Setter
, 以及在類上添加@RequiredArgsConstructor
作用位置 : 類上
-
代碼示例 :
使用
@Data
注解 :@Data(staticConstructor="of") public class Company { private final Person founder; private String name; private List<Person> employees; }
等價的java源代碼 :
public class Company { private final Person founder; private String name; private List<Person> employees; private Company(final Person founder) { this.founder = founder; } //對應staticConstructor="of" public static Company of(final Person founder) { return new Company(founder); } public Person getFounder() { return founder; } public String getName() { return name; } public void setName(final String name) { this.name = name; } public List<Person> getEmployees() { return employees; } public void setEmployees(final List<Person> employees) { this.employees = employees; } @java.lang.Override public boolean equals(final java.lang.Object o) { if (o == this) return true; if (o == null) return false; if (o.getClass() != this.getClass()) return false; final Company other = (Company)o; if (this.founder == null ? other.founder != null : !this.founder.equals(other.founder)) return false; if (this.name == null ? other.name != null : !this.name.equals(other.name)) return false; if (this.employees == null ? other.employees != null : !this.employees.equals(other.employees)) return false; return true; } @java.lang.Override public int hashCode() { final int PRIME = 31; int result = 1; result = result * PRIME + (this.founder == null ? 0 : this.founder.hashCode()); result = result * PRIME + (this.name == null ? 0 : this.name.hashCode()); result = result * PRIME + (this.employees == null ? 0 : this.employees.hashCode()); return result; } @java.lang.Override public java.lang.String toString() { return "Company(founder=" + founder + ", name=" + name + ", employees=" + employees + ")"; } }
@Slf4j
作用 : 自動生成一個Logger的對象
作用位置 : 類上
-
代碼示例 :
import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @Slf4j public class Slf4jTest { //@Slf4j等價于如下代碼 //private final Logger log = LoggerFactory.getLogger(Slf4jTest.class); @Test public void slfTest() { log.debug("testing"); } }
@Accessors
作用 : 通過該注解可以控制
getter
與setter
的命名與返回值 ;作用位置 : 類上
-
屬性 :
-
fluent
: 默認值為false , 當fluent
的值為true時 ,@Data
注解生成的getter
與setter
的方法名均為對應的成員變量名 , 且setter
的返回值為當前當前對象 , 如下所示;@Data @Accessors(fluent = true) class User { private Integer id; private String name; // 生成的getter和setter方法如下唱矛,方法體略 public Integer id(){} public User id(Integer id){} public String name(){} public User name(String name){} }
-
chain
: 默認值為false , 當chain
的值為true時 ,@Data
注解生成的setter
的返回值為當前對象 , 相當于開啟鏈式編程的開關(guān) , 代碼如下所示 ;@Data @Accessors(chain = true) class User { private Integer id; private String name; // 生成的setter方法如下赊级,setter返回的是當前User對象 , 方法體略 public User setId(Integer id){} public User setName(String name){} }
-
prefix
: 默認值為{} , 若指定prefix
的值 , 則生成的getter
與setter
名為屬性名 , 且會忽略其指定的前綴同時遵循駝峰命名原則 , 如下代碼所示@Data @Accessors(prefix = "f") class User { private Integer fId; //屬性名帶f private String fName; // 生成的getter和setter方法如下半抱,方法體略 public Integer id(){} // 生成的方法名為屬性名去掉前綴 public void id(Integer id){} public String name(){} public void name(String name){} }
-
參考鏈接 :
[lombok @EqualsAndHashCode 注解的影響]:https://blog.csdn.net/zhanlanmg/article/details/50392266
[官方文檔]:https://projectlombok.org/features/all
[Lombok介紹及使用方法]:https://www.cnblogs.com/holten/p/5729226.html