Lombok簡介
Lombok是一個可以通過簡單的注解形式來幫助我們簡化消除一些必須有但顯得很臃腫的Java代碼的工具,通過使用對應的注解,可以在編譯源碼的時候生成對應的方法。官方地址:https://projectlombok.org/,github地址:https://github.com/rzwitserloot/lombok。
IntelliJ IDEA 使用它的方法
- 先安裝插件

- 然后引入lombok的jar包
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.14</version> </dependency>
注解的介紹
-
@Getter and @Setter
你可以用@Getter / @Setter注釋任何字段(當然也可以注釋到類上的),讓lombok自動生成默認的getter / setter方法。
默認生成的方法是public的,如果要修改方法修飾符可以設置AccessLevel的值,例如:@Getter(access = AccessLevel.PROTECTED)

import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; public class User { @Getter(AccessLevel.PROTECTED) @Setter private Integer id; @Getter @Setter private String name; @Getter @Setter private String phone; }
-
@ToString
生成toString()方法,默認情況下,它會按順序(以逗號分隔)打印你的類名稱以及每個字段。可以這樣設置不包含哪些字段@ToString(exclude = "id") / @ToString(exclude = {"id","name"})
如果繼承的有父類的話,可以設置callSuper 讓其調用父類的toString()方法,例如:@ToString(callSuper = true)
import lombok.ToString; @ToString(exclude = {"id","name"}) public class User { private Integer id; private String name; private String phone; }
生成toString方法如下:
public String toString(){ return "User(phone=" + phone + ")"; }
-
@EqualsAndHashCode
生成hashCode()和equals()方法,默認情況下,它將使用所有非靜態,非transient字段。但可以通過在可選的exclude參數中來排除更多字段。或者,通過在parameter參數中命名它們來准確指定希望使用哪些字段。
@EqualsAndHashCode(exclude={"id", "shape"}) public class EqualsAndHashCodeExample { private transient int transientVar = 10; private String name; private double score; private Shape shape = new Square(5, 10); private String[] tags; private transient int id; public String getName() { return this.name; } @EqualsAndHashCode(callSuper=true) public static class Square extends Shape { private final int width, height; public Square(int width, int height) { this.width = width; this.height = height; } } }
對比代碼如下:
import java.util.Arrays; public class EqualsAndHashCodeExample { private transient int transientVar = 10; private String name; private double score; private Shape shape = new Square(5, 10); private String[] tags; private transient int id; public String getName() { return this.name; } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof EqualsAndHashCodeExample)) return false; EqualsAndHashCodeExample other = (EqualsAndHashCodeExample) o; if (!other.canEqual((Object)this)) return false; if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false; if (Double.compare(this.score, other.score) != 0) return false; if (!Arrays.deepEquals(this.tags, other.tags)) return false; return true; } @Override public int hashCode() { final int PRIME = 59; int result = 1; final long temp1 = Double.doubleToLongBits(this.score); result = (result*PRIME) + (this.name == null ? 43 : this.name.hashCode()); result = (result*PRIME) + (int)(temp1 ^ (temp1 >>> 32)); result = (result*PRIME) + Arrays.deepHashCode(this.tags); return result; } protected boolean canEqual(Object other) { return other instanceof EqualsAndHashCodeExample; } public static class Square extends Shape { private final int width, height; public Square(int width, int height) { this.width = width; this.height = height; } @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Square)) return false; Square other = (Square) o; if (!other.canEqual((Object)this)) return false; if (!super.equals(o)) return false; if (this.width != other.width) return false; if (this.height != other.height) return false; return true; } @Override public int hashCode() { final int PRIME = 59; int result = 1; result = (result*PRIME) + super.hashCode(); result = (result*PRIME) + this.width; result = (result*PRIME) + this.height; return result; } protected boolean canEqual(Object other) { return other instanceof Square; } } }
-
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
@NoArgsConstructor生成一個無參構造方法。當類中有final字段沒有被初始化時,編譯器會報錯,此時可用@NoArgsConstructor(force = true),然后就會為沒有初始化的final字段設置默認值 0 / false / null。對於具有約束的字段(例如@NonNull字段),不會生成檢查或分配,因此請注意,正確初始化這些字段之前,這些約束無效。
import lombok.NoArgsConstructor; import lombok.NonNull; @NoArgsConstructor(force = true) public class User { @NonNull private Integer id; @NonNull private String name; private final String phone ; }
@RequiredArgsConstructor會生成構造方法(可能帶參數也可能不帶參數),如果帶參數,這參數只能是以final修飾的未經初始化的字段,或者是以@NonNull注解的未經初始化的字段
@RequiredArgsConstructor(staticName = "of")會生成一個of()的靜態方法,並把構造方法設置為私有的


import lombok.NonNull; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class User { @NonNull private Integer id ; @NonNull private String name = "bbbb"; private final String phone; } //另外一個 import lombok.NonNull; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor(staticName = "of") public class User { @NonNull private Integer id ; @NonNull private String name = "bbbb"; private final String phone; }
@AllArgsConstructor 生成一個全參數的構造方法

import lombok.AllArgsConstructor; import lombok.NonNull; @AllArgsConstructor public class User { @NonNull private Integer id ; @NonNull private String name = "bbbb"; private final String phone; }
-
@Data
@Data 包含了 @ToString、@EqualsAndHashCode、@Getter / @Setter和@RequiredArgsConstructor的功能
-
@Accessors
@Accessors 主要用於控制生成的getter和setter
主要參數介紹- fluent boolean值,默認為false。此字段主要為控制生成的getter和setter方法前面是否帶get/set
- chain boolean值,默認false。如果設置為true,setter返回的是此對象,方便鏈式調用方法
- prefix 設置前綴 例如:@Accessors(prefix = "abc") private String abcAge 當生成get/set方法時,會把此前綴去掉
Paste_Image.png -
@Synchronized
給方法加上同步鎖
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"); } }
//等效代碼 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"); } } }
-
@Wither
提供了給final字段賦值的一種方法
//使用lombok注解的 import lombok.AccessLevel; import lombok.NonNull; import lombok.experimental.Wither; public class WitherExample { @Wither private final int age; @Wither(AccessLevel.PROTECTED) @NonNull private final String name; public WitherExample(String name, int age) { if (name == null) throw new NullPointerException(); this.name = name; this.age = age; } }
//等效代碼 import lombok.NonNull; public class WitherExample { private final int age; private @NonNull final String name; public WitherExample(String name, int age) { if (name == null) throw new NullPointerException(); this.name = name; this.age = age; } public WitherExample withAge(int age) { return this.age == age ? this : new WitherExample(age, name); } protected WitherExample withName(@NonNull String name) { if (name == null) throw new java.lang.NullPointerException("name"); return this.name == name ? this : new WitherExample(age, name); } }
-
@onX
在注解里面添加注解的方式
直接看代碼
public class SchoolDownloadLimit implements Serializable { private static final long serialVersionUID = -196412797757026250L; @Getter(onMethod = @_({@Id,@Column(name="id",nullable=false),@GeneratedValue(strategy= GenerationType.AUTO)})) @Setter private Integer id; @Getter(onMethod = @_(@Column(name="school_id"))) @Setter private Integer schoolId; @Getter(onMethod = @_(@Column(name = "per_download_times"))) @Setter private Integer perDownloadTimes; @Getter(onMethod = @_(@Column(name = "limit_time"))) @Setter private Integer limitTime; @Getter(onMethod = @_(@Column(name = "download_to_limit_an_hour"))) @Setter private Integer downloadToLimitInHour; @Getter(onMethod = @_(@Column(name = "available"))) @Setter private Integer available = 1; }
-
@Builder
@Builder注釋為你的類生成復雜的構建器API。
lets you automatically produce the code required to have your class be instantiable with code such as:
Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
直接看官方示例,對比一下就都明白了
//使用lombok注解的 import lombok.Builder; import lombok.Singular; import java.util.Set; @Builder public class BuilderExample { private String name; private int age; @Singular private Set<String> occupations; }
//等效代碼 import java.util.Set; class BuilderExample { private String name; private int age; private Set<String> occupations; BuilderExample(String name, int age, Set<String> occupations) { this.name = name; this.age = age; this.occupations = occupations; } public static BuilderExampleBuilder builder() { return new BuilderExampleBuilder(); } public static class BuilderExampleBuilder { private String name; private int age; private java.util.ArrayList<String> occupations; BuilderExampleBuilder() { } public BuilderExampleBuilder name(String name) { this.name = name; return this; } public BuilderExampleBuilder age(int age) { this.age = age; return this; } public BuilderExampleBuilder occupation(String occupation) { if (this.occupations == null) { this.occupations = new java.util.ArrayList<String>(); } this.occupations.add(occupation); return this; } public BuilderExampleBuilder occupations(Collection<? extends String> occupations) { if (this.occupations == null) { this.occupations = new java.util.ArrayList<String>(); } this.occupations.addAll(occupations); return this; } public BuilderExampleBuilder clearOccupations() { if (this.occupations != null) { this.occupations.clear(); } return this; } public BuilderExample build() { // complicated switch statement to produce a compact properly sized immutable set omitted. // go to https://projectlombok.org/features/Singular-snippet.html to see it. Set<String> occupations = ...; return new BuilderExample(name, age, occupations); } @java.lang.Override public String toString() { return "BuilderExample.BuilderExampleBuilder(name = " + this.name + ", age = " + this.age + ", occupations = " + this.occupations + ")"; } } }
-
@Delegate
這個注解也是相當的牛逼,看下面的截圖,它會該類生成一些列的方法,這些方法都來自與List接口
Paste_Image.png
附帶一個我使用的例子
import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.ToString; import lombok.experimental.Accessors; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import java.io.Serializable; import java.util.Date; @Entity @Table(name= Constants.TABLE_SCHOOL_DOWNLOAD_LIMIT) @RequiredArgsConstructor(staticName = "of") @Accessors(chain = true) @ToString public class SchoolDownloadLimit implements Serializable { private static final long serialVersionUID = -196412797757026250L; @Getter(onMethod = @_({@Id,@Column(name="id",nullable=false),@GeneratedValue(strategy= GenerationType.AUTO)})) @Setter private Integer id; @Getter(onMethod = @_(@Column(name="school_id"))) @Setter private Integer schoolId; @Getter(onMethod = @_(@Column(name = "per_download_times"))) @Setter private Integer perDownloadTimes; @Getter(onMethod = @_(@Column(name = "limit_time"))) @Setter private Integer limitTime; @Getter(onMethod = @_(@Column(name = "download_to_limit_an_hour"))) @Setter private Integer downloadToLimitInHour; @Getter(onMethod = @_(@Column(name = "available"))) @Setter private Integer available = 1; @Getter(onMethod = @_(@Column(name = "create_time"))) @Setter private Date createTime; @Getter(onMethod = @_(@Column(name = "update_time"))) @Setter private Date updateTime; }
作者:緩慢移動的蝸牛
鏈接:https://www.jianshu.com/p/365ea41b3573
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。