Jump to content
  • Hello visitors, welcome to the Hacker World Forum!

    Red Team 1949  (formerly CHT Attack and Defense Team) In this rapidly changing Internet era, we maintain our original intention and create the best community to jointly exchange network technologies. You can obtain hacker attack and defense skills and knowledge in the forum, or you can join our Telegram communication group to discuss and communicate in real time. All kinds of advertisements are prohibited in the forum. Please register as a registered user to check our usage and privacy policy. Thank you for your cooperation.

    TheHackerWorld Official

Java Lombok用法

 Share


NedK7

Recommended Posts

 

lombok 官網提供了許多注解,但是「勁酒雖好,可不能貪杯」,你用了越多 lombok 的進階用法,會讓整個團隊的學習曲線上升,反而會造成反效果,所以在此處只解釋最最常見、並且我認為最必要的注解使用方式,其他的用法就不介紹了

lombok_overview.png

1. @Getter/@Setter

自動產生 getter/setter

lombok_getter_setter.png

2. @ToString

自動 override toString() 方法,會印出所有變量

lombok_tostring.png

3. @EqualsAndHashCode

自動生成 equals(Object other) 和 hashcode() 方法,包括所有非靜態變量和非 transient 的變量

lombok_equalsandhashcode.png

如果某些變量不想要加進判斷,可以透過 exclude 排除,也可以使用 of 指定某些字段

lombok_equalsandhashcode_exclude.png

Q : 為什麼只有一個整體的 @EqualsAndHashCode 注解,而不是分開的兩個 @Equals 和 @HashCode

A : 在 Java 中有規定,當兩個 object equals 時,他們的 hashcode 一定要相同,反之,當 hashcode 相同時,object 不一定 equals。所以 equals 和 hashcode 要一起 implement,免得發生違反 Java 規定的情形發生

4. @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

這三個很像,都是在自動生成該類的 constructor,差別只在生成的 constructor 的參數不一樣而已

@NoArgsConstructor : 生成一個沒有參數的constructor

lombok_noargsconstructor.png

@AllArgsConstructor : 生成一個包含所有參數的 constructor

lombok_allargsconstructor.png

這裡注意一個 Java 的小坑,當我們沒有指定 constructor 時,Java compiler 會幫我們自動生成一個沒有任何參數的 constructor 給該類,但是如果我們自己寫了 constructor 之後,Java 就不會自動幫我們補上那個無參數的 constructor 了

然而很多地方(像是 Spring Data JPA),會需要每個類都一定要有一個無參數的 constructor,所以你在加上 @AllArgsConstructor 時,拜託,一定要補上 @NoArgsConstrcutor,不然會有各種坑等著你

@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Integer id;
    private String name;
}

@RequiredArgsConstructor : 生成一個包含 “特定參數” 的 constructor,特定參數指的是那些有加上 final 修飾詞的變量們

lombok_requiredargsconstructor.png

補充一下,如果所有的變量都是正常的,都沒有用 final 修飾的話,那就會生成一個沒有參數的 constructor

5. @Data

懶人包,只要加了 @Data 這個注解,等於同時加了以下注解

  • @Getter/@Setter
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor

lombok_data.png

@Data 是使用頻率最高的lombok注解,通常 @Data 會加在一個值可以被更新的 Object 上,像是日常使用的 DTO 們、或是 JPA 裡的 Entity 們,就很適合加上 @Data 注解,也就是 @Data for mutable class

6. @Value

也是懶人包,但是他會把所有的變量都設成 final 的,其他的就跟 @Data 一樣,等於同時加了以下注解

  • @Getter (注意沒有setter)
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor

lombok_value.png

上面那個 @Data 適合用在 POJO 或 DTO 上,而這個 @Value 注解,則是適合加在值不希望被改變的類上,像是某個類的值當創建後就不希望被更改,只希望我們讀它而已,就適合加上 @Value 注解,也就是 @Value for immutable class

另外注意一下,此 lombok 的注解 @Value 和另一個 Spring 的注解 @Value 撞名,在 import 時不要 import 錯了

7. @Builder

自動生成流式 set 值寫法,從此之後再也不用寫一堆 setter 了

lombok_builder.png

注意,雖然只要加上 @Builder 注解,我們就能夠用流式寫法快速設定 Object 的值,但是 setter 還是必須要寫不能省略的,因為 Spring 或是其他框架有很多地方都會用到 Object 的 getter/setter 對他們取值/賦值

所以通常是 @Data 和 @Builder 會一起用在同個類上,既方便我們流式寫 code,也方便框架做事

@Data
@Builder
public class User {
    private Integer id;
    private String name;
}

8. @Slf4j

自動生成該類的 log 靜態常量,要打日誌就可以直接打,不用再手動 new log 靜態常量了

lombok_slf4j.png

除了 @Slf4j 之外,lombok 也提供其他日誌框架的變種注解可以用,像是 @Log、@Log4j…等,他們都是幫我們創建一個靜態常量 log,只是使用的 library 不一樣而已

@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

Link to post
Link to comment
Share on other sites

 Share

discussion group

discussion group

    You don't have permission to chat.
    • Recently Browsing   0 members

      • No registered users viewing this page.
    ×
    ×
    • Create New...