Java之Lombok

轉載請註明出處:java

1. Lombok背景介紹maven

官方介紹以下:ide

Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.

大體意思是Lombok經過增長一些「處理程序」,可讓java變得簡潔、快速。ui

 

2.Lombok能以簡單的註解形式來簡化java代碼,提升開發人員的開發效率。例如開發中常常須要寫的javabean,都須要花時間去添加相應的getter/setter,也許還要去寫構造器、equals等方法,並且須要維護,當屬性多時會出現大量的getter/setter方法,這些顯得很冗長也沒有太多技術含量,一旦修改屬性,就容易出現忘記修改對應方法的失誤。
Lombok能經過註解的方式,在編譯時自動爲屬性生成構造器、getter/setter、equals、hashcode、toString方法。出現的神奇就是在源碼中沒有getter和setter方法,可是在編譯生成的字節碼文件中有getter和setter方法。這樣就省去了手動重建這些代碼的麻煩,使代碼看起來更簡潔些。
Lombok的使用跟引用jar包同樣,能夠在官網(https://projectlombok.org/download)下載jar包,也可使用maven添加依賴:this

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
    <scope>provided</scope>
</dependency>

接下來咱們來分析Lombok中註解的具體用法。spa

2.1 @Data
@Data註解在類上,會爲類的全部屬性自動生成setter/getter、equals、canEqual、hashCode、toString方法,如爲final屬性,則不會爲該屬性生成setter方法。指針

import lombok.AccessLevel;
import lombok.Setter;
import lombok.Data;
import lombok.ToString;
 
@Data 
public class DataExample {
  private final String name;
  private int age;
  private double score;
  private String[] tags;
  
  @ToString(includeFieldNames=true)
  @Data(staticConstructor="of")
  public static class Exercise<T> {
    private final String name;
    private final T value;
  }
}

2.2 @Getter/@Setter
若是以爲@Data太過殘暴(由於@Data集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor的全部特性)不夠精細,
可使用@Getter/@Setter註解,此註解在屬性上,能夠爲相應的屬性自動生成Getter/Setter方法,也能夠在類上,則自動對類屬性生成getter方法和setter方法。code

2.3 @NonNull
該註解用在屬性或構造器上,Lombok會生成一個非空的聲明,可用於校驗參數,能幫助避免空指針。
示例以下:blog

import lombok.NonNull;
 
public class NonNullExample extends Something {
  private String name;
  
  public NonNullExample(@NonNull Person person) {
    super("Hello");
    this.name = person.getName();
  }
}

2.4 @ToString
類使用@ToString註解,Lombok會生成一個toString()方法,默認狀況下,會輸出類名、全部屬性(會按照屬性定義順序),用逗號來分割。
經過將includeFieldNames參數設爲true,就能明確的輸出toString()屬性。這一點是否是有點繞口,經過代碼來看會更清晰些。
使用Lombok的示例:ip

import lombok.ToString;
 
@ToString(exclude="id")
public class ToStringExample {
  private static final int STATIC_VAR = 10;
  private String name;
  private Shape shape = new Square(5, 10);
  private String[] tags;
  private int id;
  
  public String getName() {
    return this.getName();
  }
  
  @ToString(callSuper=true, includeFieldNames=true)
  public static class Square extends Shape {
    private final int width, height;
    
    public Square(int width, int height) {
      this.width = width;
      this.height = height;
    }
  }
}

2.5 @NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
無參構造器、部分參數構造器、全參構造器。Lombok無法實現多種參數構造器的重載。
Lombok示例代碼以下

import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.NonNull;
 
@RequiredArgsConstructor(staticName = "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;
  }
}

 

3. Lombok的優缺點 優勢: 1. 能經過註解的形式自動生成構造器、getter/setter、equals、hashcode、toString等方法,提升了必定的開發效率 2. 讓代碼變得簡潔,不用過多的去關注相應的方法 3. 屬性作修改時,也簡化了維護爲這些屬性所生成的getter/setter方法等 缺點: 1. 不支持多種參數構造器的重載 2. 雖然省去了手動建立getter/setter方法的麻煩,但大大下降了源代碼的可讀性和完整性,下降了閱讀源代碼的溫馨度

相關文章
相關標籤/搜索