常用的幾個注解:
@Data : 注在類上,提供類的get、set、equals、hashCode、canEqual、toString方法
@AllArgsConstructor : 注在類上,提供類的全參構造
@NoArgsConstructor : 注在類上,提供類的無參構造
@Setter : 注在屬性上,提供 set 方法
@Getter : 注在屬性上,提供 get 方法
@EqualsAndHashCode : 注在類上,提供對應的 equals 和 hashCode 方法
@Log4j/@Slf4j : 注在類上,提供對應的 Logger 對象,變量名為 log
關於@EqualsAndHashCode 注解的細節使用
-
此注解會生成 equals(Object other) 和 hashCode()方法。
-
它默認使用非靜態,非瞬態的屬性
-
可通過參數exclude排除一些屬性
-
可通過參數of指定僅使用哪些屬性
-
它默認僅使用該類中定義的屬性且不調用父類的方法
實現equals, hashCode方法是在編程生活中再常見不過的一個東西了,那么自然@EqualsAndHashCode 這個annotation就成為了一個非常方便的工具。
默認情況下,被這個annotation標注的class會用到 除了 static,transient修飾的 所有屬性作為判斷標准,當然和之前的annotation一樣,可是使用exclude選項除掉不想要的屬性。
也可以通過callSuper包含父類的equals 和 hashCode。 當然如果你的class 沒有繼承任何其他的class,你卻寫了callSuper,那么會收獲一個編譯報錯。
加入 maven 依賴
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency>
1. @Getter/@Setter
自動產生 getter/setter
2. @ToString
自動重寫 toString()
方法,會印出所有變量
3. @EqualsAndHashCode
自動生成 equals(Object other)
和 hashcode()
方法,包括所有非靜態變量和非 transient 的變量
如果某些變量不想要加進判斷,可以透過 exclude 排除,也可以使用 of 指定某些字段
Q : 為什么只有一個整體的 @EqualsAndHashCode
注解,而不是分開的兩個 @Equals
和 @HashCode
?
A : 在 Java 中有規定,當兩個對象 equals 時,他們的 hashcode 一定要相同,反之,當 hashcode 相同時,對象不一定 equals。所以 equals 和 hashcode 要一起實現,免得發生違反 Java 規定的情形發生
4. @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor
這三個很像,都是在自動生成該類的構造器,差別只在生成的構造器的參數不一樣而已
@NoArgsConstructor : 生成一個沒有參數的構造器
@AllArgsConstructor : 生成一個包含所有參數的構造器
這里注意一個 Java 的小坑,當我們沒有指定構造器時,Java 編譯器會幫我們自動生成一個沒有任何參數的構造器給該類,但是如果我們自己寫了構造器之后,Java 就不會自動幫我們補上那個無參數的構造器了
然而很多地方(像是 Spring Data JPA),會需要每個類都一定要有一個無參數的構造器,所以你在加上 @AllArgsConstructor
時,一定要補上 @NoArgsConstrcutor
,不然會有各種坑等着你
@RequiredArgsConstructor : 生成一個包含 "特定參數" 的構造器,特定參數指的是那些有加上 final 修飾詞的變量們
補充一下,如果所有的變量都是正常的,都沒有用 final 修飾的話,那就會生成一個沒有參數的構造器
5. @Data
整合包,只要加了 @Data 這個注解,等於同時加了以下注解
- @Getter/@Setter
- @ToString
- @EqualsAndHashCode
- @RequiredArgsConstructor
@Data 是使用頻率最高的 lombok 注解,通常 @Data 會加在一個值可以被更新的對象上,像是日常使用的 DTO 們、或是 JPA 裡的 Entity 們,就很適合加上 @Data 注解,也就是 @Data for mutable class
6. @Value
也是整合包,但是他會把所有的變量都設成 final 的,其他的就跟 @Data 一樣,等於同時加了以下注解
- @Getter (注意沒有setter)
- @ToString
- @EqualsAndHashCode
- @RequiredArgsConstructor
上面那個 @Data 適合用在 POJO 或 DTO 上,而這個 @Value 注解,則是適合加在值不希望被改變的類上,像是某個類的值當創建后就不希望被更改,只希望我們讀它而已,就適合加上 @Value 注解,也就是 @Value for immutable class
另外注意一下,此 lombok 的注解 @Value 和另一個 Spring 的注解 @Value 撞名,在 import 時不要 import 錯了
7. @Builder
自動生成流式 set 值寫法,從此之后再也不用寫一堆 setter 了
注意,雖然只要加上 @Builder 注解,我們就能夠用流式寫法快速設定對象的值,但是 setter 還是必須要寫不能省略的,因為 Spring 或是其他框架有很多地方都會用到對象的 getter/setter 對他們取值/賦值
所以通常是 @Data 和 @Builder 會一起用在同個類上,既方便我們流式寫代碼,也方便框架做事
8. @Slf4j
自動生成該類的 log 靜態常量,要打日志就可以直接打,不用再手動 new log 靜態常量了
除了 @Slf4j 之外,lombok 也提供其他日志框架的變種注解可以用,像是 @Log、@Log4j...等,他們都是幫我們創建一個靜態常量 log,只是使用的庫不一樣而已
@Log //對應的log語句如下 private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName()); @Log4j //對應的log語句如下 private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
SpringBoot默認支持的就是 slf4j + logback 的日志框架,所以也不用再多做啥設定,直接就可以用在 SpringBoot project上,log 系列注解最常用的就是 @Slf4j