lombok工具應用

前言

Lombok 是一種 Java™ 實用工具,可用來幫助開發人員消除 Java 的冗長,尤其是對於簡單的 Java 對象(POJO)。它通過註解實現這一目的。

正文

添加依賴

在 pom.xml 文件中添加相關依賴:

<!--lombok工具依賴-->
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.16.20</version>
	<scope>provided</scope>
</dependency>

安裝插件

由於 Lombok 採取的註解形式的,在編譯後,自動生成相應的方法,爲了不讓 ide 瘋了,需要下載插件了支持它。 
以 idea 爲例:查找插件 lombok plugin 安裝即可。

用我的 User 實體類爲例(set,get,toString 方法),

@Getter
@Setter
@ToString
public class SysUserEntity implements Serializable

在按快捷鍵 Ctrl + F12,可以查找到set,get,toString 方法。

註解

寫點常用的,其餘的 api 的打開 Jar 包一目瞭然

@Getter

@Setter

@ToString

@EqualsAndHashCode

構造函數

@AllArgsConstructor

會生成一個包含所有變量,同時如果變量使用了NotNull annotation , 會進行是否爲空的校驗, 
全部參數的構造函數的自動生成,該註解的作用域也是只有在實體類上,參數的順序與屬性定義的順序一致。

@NoArgsConstructor

無參構造函數

@RequiredArgsConstructor

會生成一個包含常量(final),和標識了@NotNull的變量 的構造方法。

怎麼使用

它們都有三個參數可以設置 
1. String staticName() default "";

如果設置了它,將原來的構造方法的訪問修飾符將會變成 私有的,而外添加一個靜態構造方法,參數相同,名字是設置的字符串的名字,訪問修飾符爲公有的。

  1. AnyAnnotation[] onConstructor() default {}; 
    在構造方法上添加註解。使用方法@RequiredArgsConstructor(onConstructor=@__({@AnnotationsGoHere}))}

    例如我們在 Spring 項目中需要注入多個值,寫很多個 @Autowired 很麻煩,就可以使用這種方式:

    @Service
    @RequiredArgsConstructor(onConstructor = @__(@Autowired))
    public class UserServiceImpl implements IUserService {
       private final IUserRepository userRepository;
       private final IOrderRepository orderRepository;
       ………………
  2. AccessLevel access() default lombok.AccessLevel.PUBLIC; 
    構造函數訪問修飾符;

  3. @NoArgsConstructor無參構造函數中還有個註解 boolean force() default false; 
    作者的註釋是 If {@code true}, initializes all final fields to 0 / null / false. Otherwise, a compile time error occurs.

    設置爲 true 的時候,初始化所有的參數爲默認值,否則編譯錯誤。

@Data

我自己嘗試了下,我們使用 @Data 註解就可以有下面幾個註解的功能: @ToString@Getter@Setter@EqualsAndHashCode@NoArgsConstructor 。

注意的是,同時使用@Data 和 @AllArgsConstructor 後 ,默認的無參構造函數失效,如果需要它,要重新設置 @NoArgsConstructor

@Slf4j

//類上面註解了,直接調用 log 即可:
log.info(xxxx);

@Log

使用的是 java.util.logging.Logger ,直接使用 變量 log

@Builder聲明實體,表示可以進行Builder方式初始化,@Value註解,表示只公開getter,對所有屬性的setter都封閉,即private修飾,所以它不能和@Builder現起用

一般地,我們可以這樣設計實體!

 

@Builder(toBuilder = true)
@Getter
public class UserInfo {
  private String name;
  private String email;
  @MinMoney(message = "金額不能小於0.")
  @MaxMoney(value = 10, message = "金額不能大於10.")
  private Money price;

}

 

@Builder註解賦值新對象

UserInfo userInfo = UserInfo.builder()
        .name("zzl")
        .email("[email protected]")
        .build();

@Builder註解修改原對象的屬性值

修改實體,要求實體上添加@Builder(toBuilder=true)

 userInfo = userInfo.toBuilder()
        .name("OK")
        .email("[email protected]")
        .build();

@Cleanup

@Cleanup 
InputStream in = new FileInputStream(args[0]);
@Cleanup 
OutputStream out = new FileOutputStream(args[1]);

自動化關閉流,相當於 jdk1.7 種的 try with resource

val

類型推導。

 val example = new ArrayList<String>();
 example.add("Hello, World!");

對應的轉換後代碼就是:

 val example = new ArrayList<String>();
 example.add("Hello, World!");

@NonNull

public NonNullExample(@NonNull Person person) {
    this.name = person.getName();
 }

轉換後就是:

public NonNullExample(@NonNull Person person) {
    if (person == null) {
      throw new NullPointerException("person");
    }
    this.name = person.getName();
 }

@SneakyThrows

翻譯就是暗中拋出異常

當我們需要拋出異常,在當前方法上調用,不用顯示的在方法名後面寫 throw

@SneakyThrows(Exception.class)

@Sychronized 是一個處理線程安全問題的annotation, 他的使用方法和關鍵字 synchronized比較類似,但是有一些不同點就是,關鍵字synchronized是鎖定當前對象(this指針) , 而@Synchronized則會鎖定一個private的常量。如果當前類中沒有這個常量,就會自動生成一個。

Java代碼 

import lombok.Synchronized;  
  
public class SynchronizedExample {  
  private final Object readLock = new Object();  
    
  @Synchronized  
  public static void hello() {  
    System.out.println("world");  
  }  
    
  @Synchronized  
  public int answerToLife() {  
    return 42;  
  }  
    
  @Synchronized("readLock")  
  public void foo() {  
    System.out.println("bar");  
  }  
}  

如果當前鎖定的方法是一個靜態的方法的話,會自動生成一個靜態常量,如果是一個普通方法的話會生成一個普通常量,類型爲Object

 

Java代碼 

public class SynchronizedExample {  
  private static final Object $LOCK = new Object[0];  
  private final Object $lock = new Object[0];  
  private final Object readLock = new Object();  
    
  public static void hello() {  
    synchronized($LOCK) {  
      System.out.println("world");  
    }  
  }  
    
  public int answerToLife() {  
    synchronized($lock) {  
      return 42;  
    }  
  }  
    
  public void foo() {  
    synchronized(readLock) {  
      System.out.println("bar");  
    }  
  }  
}  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章