Lombok——代碼簡化

lombok是一個簡化代碼的類庫,可以使Java代碼看起來更簡潔,本質是在編譯階段會根據註解生成一些代碼。

搭建環境比較簡單,

第一步,引入lombok的Jar包。

第二步,在IDE上安裝插件,例如idea的插件庫直接搜索lombok即可。

它的註解,按照階段分爲兩類,stable(穩定版), experimental(測試版),本文只介紹穩定版本。

根據功能劃分爲兩類,添加在類上,簡化類的註解。添加在方法上,簡化方法的註解。

1、類

1.1  實體Bean

  1.1.1  getter & setter

  描述:爲實體Bean添加getter和setter方法。

  原理:

      編譯前代碼:

@Getter 
private String name

     編譯後代碼:

public String getName(){ 
  return this.name
};

  註解屬性:

    AccessLevel:get&set方法的修飾符,默認爲public,可選值有private, public, protected, package, none。當爲none時,不會生成get和set方法,最典型的就是序列化ID。

  場景:使用頻率非常高,添加在實體bean上,忽略序列化ID。

  示例:略

  1.1.2  toString

  描述:生成toString方法。默認的格式爲”類名(fieldname=fieldValue)”,擁有多個字段,會有多組fieldname=fieldValue。

  原理:

    編譯前代碼: 

@ToString
public class Test { 
	private String name;
}

    生成代碼:

public String toString(){
	return "Test(name=" + this.name +")"; 
}

  註解屬性:

    @ToString.Exclude:添加在字段上時,不包含該字段。

    onlyExplicitlyIncluded:默認情況下toString會包含所有字段,並排除掉@ToString.Exclude,設置該屬性之後,toString只會包含@ToString.include的字段。

    @ToString.include:包含該字段。

  場景:頻率較低,主流方式是將對象轉換爲JSON字符串。

  示例:略

1.1.3  equalAndHashCode

  描述:生成equals和hashCode方法。

  原理:略。

  註解屬性:與@ToString類似,包含或排除某個字段。略。

  場景:頻率較低。

  示例:略。

1.1.4  xxConstructor

  描述:生成構造器,有三種,

  @NoArgsConstructor:無參註解

  @RequiredArgsConstructor:有部分字段作爲參數的構造器。

  @AllArgsConstructor:有所有字段作爲參數的構造器。

原理:

註解屬性:

場景:

示例:

1.1.5  data

描述:@Getter,@Setter,@EqualAndHashCode, @RequiredArgsConstructor的總和。

原理:略。

註解屬性:略。

場景:略。

示例:略。

1.1.6  value

  描述:與@data註解相似,區別在於生成不可變類,所有字段添加final修飾符,不生成set方法。

  原理:略。

  註解屬性:

    @NonFinal:在字段上添加@NonFinal,生成時,不會添加final修飾符。

  場景:略。

  示例:略。

  1.1.7  with

  描述:生成一個withXX方法根據字段進行比較,若字段值相同,返回當前對象,字段值不同,新創建一個對象,參數爲該字段值。

  原理:

    編譯前代碼: 

@With 
private String name;

    生成代碼:

public User withName(String name){
   return this.name == name ? this : new User(name);
}

  註解屬性:

    AccessLevel:與getter&setter註解中的同名屬性含義想相同,此處指定withXX方法的修飾符。

  場景:略。

  示例:略。

  1.1.8  builder

  描述:用構造器模式的方式生成相關的方法。例如User對象,

User user = User.builder()

.age(xx) // 年齡

.name(xx) // 姓名

.address(xx); // 地址。

  原理:略。

  註解屬性:

      @Builder.Default:無需指定,自動生成的,例如new Date()。

      @Singular:在集合屬性上添加。生成的方法會有不同。

  場景:若寫builder方法,通常還需要添加一些邏輯,不會像set方法那樣簡單,實際使用頻率較低。

  示例:略。

1.2  公共屬性

  爲對象添加一個常用的,公共的對象實例,例如,最常見的log。

  1.2.1  Log

  描述:爲對象添加一個公共屬性log。不同註解添加的log類型不同。

@commonLog: org.apache.commons.logging.Log

@Flogger:  com.google.common.flogger.FluentLogger

@JBossLog: org.jboss.logging.Logger

@Log: java.util.Logging.Logger

@Log4j: org.apache.log4j.log

@Log4j2: org.apache.logging.log4j.Logger

@Slf4j: org.slf4j.Logger

@CustomLog:org.apache.commons.logging.LogFactory.getLog("CounterLog")

1.2.2  Locked

  描述:在方法上添加鎖的註解,生成一個鎖的實例對象。有三種類型註解

  @Locked:創建ReentrantLock實例。

  @Locked.read 或 @Locked.write:創建ReentrantReadWriteLock實例。

  原理:

    編譯前代碼: 

@Locked("baseLock")
public void test() {
	System.out.println("hello Java");
}

    生成代碼:

private final Lock baseLock = new ReentrantLock();
public void foo() {
	this.baseLock.lock();
	try {
	  System.out.println("bar");
	} finally {
	  this.baseLock.unlock();
	}
}

  註解屬性:

    value:指定屬性的名稱。

場景:略。

示例:略。

1.2.3  synchronized

  描述:在方法上添加該註解,會生成一個公共屬性$lock或$LOCK。

  在實例方法上添加此註解時,會自動生成$lock屬性,並synchronized該字段。

  在靜態方法上添加此註解時,會自動生成$LOCK屬性,並synchronized該字段。

  原理:

    編譯前代碼: 

@synchronized
public void test(){};

    生成代碼:

private final Object $lock = new Object[0];
public void test{
	synchronized($lock){
		// 代碼塊
	}
}

  註解屬性:

    value:指定屬性的名稱。例如@synchronized(“syncProp”),公共屬性名稱從$lock或$LOCK替換爲syncProp。

  場景:略。

  示例:略。

2、方法

2.1  公共

2.1.1  sneakyThrows

  描述:方法上無需聲明顯示異常。

  原理:

    編譯前代碼: 

@SneakyThrows("IOException")
public void test(){};

    生成代碼:

public void test(){
	try{
        // test代碼塊。
	}catch(IOException e){
		throw Lombok.sneakyThrow(e);
	}
}

  註解屬性:無。

  場景:IO操作方法時比較多。

  示例:略。

2.2  變量

  2.2.1  var & val

  描述:定義變量,無需指定具體類型,類似於JS。

  原理:

    編譯前代碼: 

var str = new String();

    生成代碼:

String str = new String();

  註解屬性:無。

  場景:通常變量名根據類型生成,反而不方便。

  示例:var user = new User();

  val註解和它是相似的,唯一的區別在於生成的變量帶有final修飾符。

  2.2.2  cleanup

  描述:添加在變量上,生成finally方法,調用變量的close方法。

  原理:

    編譯前代碼: 

@CleanUp 
Connection conn = new Connection();

    生成代碼: 

Connection conn = new Connection();
try{
	// new Connection的後續代碼
}finally{
	if(conn!=null){
		conn.close();
	}
}

  註解屬性:

    value:指定方法的名稱,例如@CleanUp(“destory”),會調用destory方法。

  場景:沒有try, catch,代碼簡潔很多。

  示例:@CleanUp InputStream input = new FileInputStream(“fileName”)

2.3  參數

  2.3.1  nonNull

  描述:判斷參數非空。

  原理:

    編譯前代碼: 

public void test(@NonNull String name)

    生成代碼: 

public void test(String name){
  if(name == null){
	      throw new NullPointerException(“name is marked non-null but is  null”)
  }
  // test方法的後續代碼
}

  註解屬性:略。

  場景:影響代碼的閱讀,通常不會使用。

  示例:略。

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