Java神奇工具——Lombok[最全]
最近剛接觸,結果官網訪問速度很慢,網上部落格又沒有介紹全,打算自己做個詳細的,以防後面複習使用。
目錄
有哪些註解可以使用呢[1.16.18版本一共18個註解,有一個註解不推薦使用]
@AllArgsConstructor / @NoArgsConstructor / @RequiredArgsConstructor
Lombok
這個是Java一個神奇工具,使用註解,減少Java的冗餘程式碼。最低支援Jdk1.6【我用的是Jdk1.8】
官網:https://www.projectlombok.org
github原始碼地址:https://github.com/rzwitserloot/lombok【又是個胖胖的大佬寫的】
官網上對此也有介紹:Lombok專案是一個Java庫, 它可以自動插入你的編輯器並構建工具,為你的Java程式新增興趣。永遠不需要再寫getter方法或者equals方法了。更早地去接觸Java地未來,就像接觸val一樣。
顯而易見,這個工具就是讓我們在建立實體類的時候,變得簡單,輕鬆。
如何用Lombok——兩種方法
1.如果你是IDEA,可以直接安裝外掛
2.如果你是Maven專案,可以新增到pom.xml檔案中
中央倉庫選擇版本:https://mvnrepository.com/artifact/org.projectlombok/lombok
這邊使用人數最多的1.16.18版本
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> <scope>provided</scope> </dependency>
有哪些註解可以使用呢[1.16.18版本一共18個註解,有一個註解不推薦使用]
@AllArgsConstructor會生成全參構造器。
@NoArgsConstructor會生成無參構造器。但是對於具有約束的欄位(如@NonNull
欄位),不會生成任何檢查,因此請注意,在稍後正確初始化這些欄位之前,通常不會滿足這些約束。某些java構造(例如hibernate和Service Provider Interface)需要no-args建構函式。此批註主要與@Data
生成註釋的其他建構函式之一或其中一個配合使用。
@RequiredArgsConstructor會將未初始化的final變數和帶@NonNull的變數作為構造器引數。
-
@AllArgsConstructor / @NoArgsConstructor / @RequiredArgsConstructor
import lombok.AccessLevel; |
相當於:
public class ConstructorExample<T> { |
-
@Builder
@Builder
允許您使用以下程式碼自動生成使您的類可例項化所需的程式碼:Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();
@Builder
可以放在類,建構函式或方法上。雖然“在類上”和“在建構函式上”模式是最常見的用例,但@Builder
最容易用“方法”用例來解釋。
用@Builder
(從現在開始呼叫目標)註釋的方法會導致生成以下7件事:
深入瞭解網址:https://projectlombok.org/features/Builder
- 一個名為的內部靜態類
FooBuilder
,具有與靜態方法相同的型別引數(稱為構建器)。 - 在構建器中:目標的每個引數的一個私有非靜態非最終欄位。
- 在構建器中:一個包私有no-args空建構函式。
- 在構建器中:對於目標的每個引數,類似於“setter”的方法:它具有與該引數相同的型別和相同的名稱。它返回構建器本身,以便可以連結setter呼叫,如上例所示。
- 在構建器中:
build()
呼叫方法的方法,傳入每個欄位。它返回與目標返回的相同型別。 - 在構建器中:一個明智的
toString()
實現。 - 在包含目標的類中:一種
builder()
方法,它建立構建器的新例項。
@ Builder.Default
如果在構建會話期間從未設定某個欄位/引數,則它始終為0 / null
/ false。如果您已經放置@Builder
了一個類(而不是方法或建構函式),則可以直接在該欄位上指定預設值,並使用以下內容對該欄位進行註釋@Builder.Default
:@Builder.Default private final long created = System.currentTimeMillis();
@Singular
通過使用註釋註釋其中一個引數(如果使用方法或建構函式進行註釋@Builder
)或欄位(如果使用註釋類@Builder
)@Singular
,lombok將該構建器節點視為集合,並生成2個“加法器”方法而不是“ setter'方法。一個向集合新增單個元素,另一個將另一個集合的所有元素新增到集合中。將不生成僅設定集合(替換已新增的任何內容)的setter。還生成了“清晰”方法。這些“單一”構建器非常複雜,以保證以下屬性:
- 呼叫時
build()
,生成的集合將是不可變的。 - 在呼叫之後呼叫“adder”方法之一或“clear”方法
build()
不會修改任何已生成的物件,並且如果build()
稍後再次呼叫,則會生成自生成構建器以來添加了所有元素的另一個集合。 - 生成的集合將被壓縮到最小的可行格式,同時保持高效。
@Singular
只能應用於lombok已知的集合型別。目前,支援的型別是:
java.util
:Iterable
,Collection
和List
(ArrayList
在一般情況下由壓縮的不可修改的支援)。Set
,SortedSet
和NavigableSet
(由一個適當的大小不可修改HashSet
或TreeSet
在一般情況下支援)。Map
,SortedMap
和NavigableMap
(由一個適當的大小不可修改HashMap
或TreeMap
在一般情況下支援)。
import lombok.Builder; |
相當於:
import java.util.Set; |
您可以使用@Cleanup
以確保在程式碼執行路徑退出當前作用域之前自動清除給定資源。您可以通過使用註釋註釋任何區域性變數宣告來執行此操作@Cleanup
:@Cleanup InputStream in = new FileInputStream("some/file");
-
@Cleanup
import lombok.Cleanup; |
相當於
import java.io.*; |
@Data
是一個方便的快捷方式註釋,它捆綁了@ToString
,@EqualsAndHashCode
和@Getter
/@Setter
和@RequiredArgsConstructor
它們的特徵:換句話說,@Data
生成通常與簡單POJO(普通舊Java物件)和bean相關聯的所有樣板:所有欄位的getter,所有非的setter最終場,和適當的toString
,equals
並hashCode
實現涉及類的欄位和初始化所有final欄位,以及不具有初始已打上所有非最終場構造@NonNull
,以保證該領域從來都不是空值。
-
@Data
import lombok.AccessLevel; |
相當於:
import java.util.Arrays; |
-
@Delegate
NEW IN Lombok 0.10: Any field or no-argument method can be annotated with @Delegate
to let lombok generate delegate methods that forward the call to this field (or the result of invoking this method).
Lombok delegates all public
methods of the field's type (or method's return type), as well as those of its supertype except for all methods declared in java.lang.Object
.
You can pass any number of classes into the @Delegate
annotation's types
parameter. If you do that, then lombok will delegate all public
methods in those types (and their supertypes, except java.lang.Object
) instead of looking at the field/method's type.
All public non-Object
methods that are part of the calculated type(s) are copied, whether or not you also wrote implementations for those methods. That would thus result in duplicate method errors. You can avoid these by using the @Delegate(excludes=SomeType.class)
parameter to exclude all public methods in the excluded type(s), and their supertypes.
To have very precise control over what is delegated and what isn't, write private inner interfaces with method signatures, then specify these private inner interfaces as types in @Delegate(types=PrivateInnerInterfaceWithIncludesList.class, excludes=SameForExcludes.class)
.
-
@EqualsAndHashCode
-
@Generated
-
@Getter / @Setter
-
@NonNull
您可以在方法或建構函式的引數上使用@NonNull讓Lombok自動進行非空檢測。
import lombok.NonNull; |
相當於:
import lombok.NonNull; |
-
@SneakyThrows
@SneakyThrows
可以用來偷偷丟擲已檢查的異常而不在方法的throws
子句中實際宣告這一點。當然,應該謹慎使用這種有爭議的能力。由lombok生成的程式碼不會忽略,包裝,替換或以其他方式修改丟擲的已檢查異常; 它只是偽造了編譯器。在JVM(類檔案)級別上,無論方法的throws
子句如何,都可以丟擲所有異常(無論是否已檢查),這就是為什麼這樣做的原因。
當您想要選擇退出已檢查的異常機制時,常見的用例圍繞兩種情況:
- 一個不必要的嚴格的介面,例如
Runnable
- 無論是否傳播出你的run()
方法,檢查與否,它都將被傳遞給Thread
未處理的異常處理程式。捕獲已檢查的異常並將其包裝在某種情況RuntimeException
下只會模糊問題的真正原因。 - 一個'不可能'的例外。例如,
new String(someByteArray, "UTF-8");
宣告它可以丟擲UnsupportedEncodingException
但是根據JVM規範,UTF-8 必須始終可用。一個UnsupportedEncodingException
在這裡大約是有可能的ClassNotFoundError
,當你使用一個String物件,而你沒有捕獲這些異常。
import lombok.SneakyThrows; |
相當於:
import lombok.Lombok; |