LomBok簡化POJO

劉強東發表於2018-03-15

Lombok Plugin

該框架會自動生成某些方法(雖然這些方法可以使用AndroidStudio的快速生成), 但是程式碼量增加影響閱讀性.

我希望我的POJO只存在欄位即可;

  1. 新增依賴
    compile "org.projectlombok:lombok:1.16.18"
    annotationProcessor 'org.projectlombok:lombok:1.16.18'
複製程式碼

外掛和依賴需要都新增才有效

  1. 安裝外掛
LomBok簡化POJO
  1. 啟動animation progress

File/DefaultSettings/ Compiler, Annotation Processors. 點選啟用Annotation Processing

LomBok簡化POJO

使用方法

構造方法

  • @NoArgsConstructor
  • @RequiredArgsConstructor
  • @AllArgsConstructor

無參構造

@NoArgsConstructor(access = AccessLevel.PUBLIC, force = true, staticName = "of")
public class User {
    private String name;
    private int age;
}
複製程式碼
  • access 建立的構造方法的許可權 預設public
  • force 對於final欄位是否預設初始化
  • staticName 是否生成靜態方法建立例項(並且私有同引數構造方法)

有參構造

預設實現的有參構造方法只會實現 被final和@NonNull修飾的欄位

@AllArgsConstructor要求所有欄位都要作為構造方法引數, 不過不需要被@NonNull和Final修飾

@Getter/@Setter

@Getter
@Setter
public class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.age = age;
        this.name = name;
    }
}
複製程式碼

@ToString

自動生成toString()方法

@EqualsAndHashCode

自動生成Eaquls和HashCode的方法. 等同於IDE生成的.

@Builder

User user1 = User.builder().name("吳彥祖").age(22).build();
複製程式碼

@Data

該註解等同於同時使用了以下註解

  • @see Getter
  • @see Setter
  • @see RequiredArgsConstructor
  • @see ToString
  • @see EqualsAndHashCode
  • @see Value

@Value

@Data的區別就是會給所有沒有被@NonFinal註解修飾的欄位或者方法全部Final. 並且沒有Setter方法

並且被@Value修飾的類也將被Final修飾, 無法被繼承.

@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();
    }
}
複製程式碼

@NonNull

被該註解標註的變數會自動丟擲空指標異常,需要自己捕捉異常, 否則程式崩潰;

val

無型別的本地變數. 類似JavaScript資料型別. 外掛會根據上下文推斷出資料型別;

@Synchronized

被註解修飾的方法或者變數會自動新增同步鎖

@Singular

只能和@Builder註解配合使用

@Singular("ba_mei") private List<String> girls;

// 使用
User.builder().ba_mei("新亙結衣").clearGirls();
複製程式碼

@Accessors

@Data
@Accessors(chain = true, fluent = true, prefix = "n")
public class User {

    private String nAme = "";
    private Integer age;

    @Singular("ba_mei")
    private List<String> girls;
}
複製程式碼
  • chain Builder模式的Setter
  • fluent 直接使用欄位名()的構造方法
  • prefix 對於駝峰命名有效, 忽略字首

相關文章