Lombok使用

Lombok簡介

Lombok是一個能夠經過簡單的註解形式來幫助咱們簡化消除一些必須有但顯得很臃腫的Java代碼的工具,經過使用對應的註解,能夠在編譯源碼的時候生成對應的方法。 前端

簡單來講,咱們平時開發過程當中老是要花不少時間爲Java Bean 去建立gettersetter方法,當類裏面的屬性不少時則建立的gettersetter就不少,代碼就很長。而lombok就能夠爲咱們省去建立gettersetter方法的麻煩,代碼也會更加簡潔。java

Lombok官方地址: https://projectlombok.org/web

使用方法

1、安裝插件

操做步驟:File -> Settings... -> Plugins -> Browse repositories... -> 輸入Lombok搜索並安裝,安裝完成後重啓IntelliJ IDEA。ide

Idea設置頁面

查找Lombok

2、引用jar包

若是是使用Maven構建項目,則添加如下依賴:函數

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

不然直接下載jar包並引入到項目中,下載地址爲:下載Lombok工具

3、lombok使用

lombok的使用主要是經過註解方式,官網文檔lombok註解 有很詳細的說明。ui

@@NonNull

@NonNull爲方法或構造函數的參數生成null檢查語句,至關於if (param == null) throw new NullPointerException("param");;生成的null檢查語句會插入到方法的最前端,若是是構造函數,則在this()super()調用以後插入null檢查。this

使用lombok,咱們能夠這樣寫:spa

import lombok.NonNull;

public class User extends BaseEntity {
  private String name;
  private String password;
  
  public User(@NonNull Person person) {
    super("Hello");
    this.name = person.getName();
    this.password = person.getPassword();
  }
}

而不使用lombok則是這樣寫:插件

import lombok.NonNull;

public class User extends BaseEntity {
  private String name;
  private String password;
  
  public User(@NonNull Person person) {
    super("Hello");
    if (person == null) {
      throw new NullPointerException("person");
    }
    this.name = person.getName();
    this.password = person.getPassword();
  }
}

@Getter/@Setter

使用@Getter/@Setter給字段註解,lombok會自動生成默認的getter/setter方法,在Intellij IDEA的Structure欄中可查看這個類的概要,就能夠看到gettersetter方法已被添加到User類中:

getter和setter方法

在未指定字段修飾符狀況下,lombok生成的getter/setter方法是public的,若要修改其修飾符可設置AccessLevel的值,如:

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

public class User {

    private @Getter(AccessLevel.PRIVATE) @Setter String name;

    private @Getter @Setter String password;

}

此時能看到User類中的getName方法的圖標變成了一個鎖,說明getName方法已是private的,將不會被公開:

getter方法設置AccessLevel

@ToString

使用@ToString會生成toString()方法,它會按順序依次打印類名、字段;若想忽略輸出字段,則能夠用exclude設置參數;若是有繼承父類,能夠設置callSupertrue讓其調用父類toString()方法:

@ToString(exclude = "password", callSuper = true)
public class User extends BaseEntity {

    private @Getter @Setter String name;

    private @Getter @Setter String password;

}

@EqualsAndHashCode

使用@EqualsAndHashCode會生成hashCode()equals()方法,默認會使用全部非靜態、非transient字段;
若是想排除某些字段可設置exclude參數;
若是有繼承父類,能夠設置callSupertrue讓其調用父類生成的equals()hashCode方法,可是當沒有繼承父類並設置callSupertrue時會在編譯時報錯:

import lombok.*;

@EqualsAndHashCode(exclude = "password")
public class User {

    private @Getter @Setter String name;

    private @Getter @Setter String password;

    @EqualsAndHashCode(callSuper = true)
    public static class Department extends BaseEntity {
        private @Getter @Setter String departmentName;
    }
}

在Intellij IDEA的Structure欄中可查看到有equals()hashCode()方法:

@EqualsAndHashCode

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor

@NoArgsConstructor

生成一個無參數構造函數:

@NoArgsConstructor

@RequiredArgsConstructor

生成構造函數;若是帶有參數,則該參數必須是以final修飾並未初始化的字段或@NonNull註解的並未初始化的字段,參數的順序和字段在類中的聲明順序一致。

@NonNull註解並未初始化的:

@RequiredArgsConstructor

final修飾並未初始化的:

@RequiredArgsConstructor

正確和錯誤示例:

@RequiredArgsConstructor

@AllArgsConstructor

生成全參數構造函數,將類中的每一個字段生成帶有1個參數的構造函數,例若有3個字段,則構造函數的參數爲3個:

@AllArgsConstructor

@Data

@Data包含了@ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor的功能:

@Data

@Builder

@Builder爲類、構造器、方法上生成複雜的構建器API;構造實例時,其屬性再也不須要單獨set,能夠經過如下方式進行實例化:
Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();

其餘註解

val@Cleanup@SneakyThrows@Synchronized@Getter(lazy=true)@Logexperimental等就再也不作介紹,用法和說明可查看官網文檔https://projectlombok.org/features/all

總結

使用lombok可以爲咱們省去手動建立gettersetter方法的麻煩,lombok 有助於代碼的整潔、效率的提升以及冗餘的減小,但也同時下降了源代碼文件的可讀性和完整性。

不可過分依賴lombok。

參考

以簡單的方式消除 Java 的冗長
Lombok features
lombok

原文地址:https://www.lwhweb.com/2017/11/08/lombok-use/

相關文章
相關標籤/搜索