Lombok 是一個充當 Java 註解處理器的函式庫,旨在消除程式碼中的冗餘。它的主要功能是自動產生重複程式碼或「樣板檔案」——這些元素雖然必要,但不會為我們的程式邏輯添加直接價值。主要用於在編譯時自動產生 getter 和 setter 方法、建構子、equals()、hashCode()、toString() 方法以及 Java 類別中的其他常見元素。
無需為這些基本功能手動編寫數十行程式碼,Lombok 允許您使用簡單的註解來定義它們,從而產生更乾淨、更易於維護且不易出錯的程式碼。
要在Java專案中使用Lombok,除了安裝之外,還需要在pom.xml檔案(如果是Maven專案)或build.gradle(如果是Gradle專案)中新增對應的依賴我們正在使用的IDE中的相應插件。在這篇文章中,我們將使用 Maven 和 IntelliJ IDEA 作為範例。
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.36</version> <scope>provided</scope> </dependency> </dependencies>
如有任何疑問,您可以隨時查看Lombok的官方文件:
當我們建立一個類別時,我們會定期執行以下操作,無論是手動還是使用 IDE 提供的捷徑:
嗯,Lombok 有 @Data 註釋,它允許我們在一行中完成所有這些操作,產生與 POJO(普通舊 Java 物件) 相關的所有內容。這個註解是 @Getter、@Setter、@EqualsAndHashCode、@NoArgsConstructor 和 @AllArgsConstructor 註解的組合,我們稍後會看到。
import lombok.Data; @Data public class Persona { private String nombre; }
public class Main { public static void main(String[] args) { Persona p1 = new Persona(); p2.setNombre("Maria"); System.out.println(p1.getNombre()); } }
這些註解允許我們自動產生具有不同參數組合的建構函數,考慮到屬性是根據它們在類別中聲明的順序使用的。
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.36</version> <scope>provided</scope> </dependency> </dependencies>
這些註解可以讓我們自動為類別的所有屬性產生 getter 和 setter 方法,或只為那些標有相應註解的屬性產生 getter 和 setter 方法,即可以在類別或屬性層級使用。
import lombok.Data; @Data public class Persona { private String nombre; }
public class Main { public static void main(String[] args) { Persona p1 = new Persona(); p2.setNombre("Maria"); System.out.println(p1.getNombre()); } }
此註解自動產生 toString() 方法,該方法傳回類別及其屬性的字串表示形式,格式如下:ClassName(attribute1=value1, attribute2=value2, ...)。預設情況下,類別的所有非靜態屬性都包含在結果中,但可以使用 @ToString.Exclude 屬性來排除特定屬性。如果您只想顯示屬性的值而不是宣告的名稱,可以使用 @ToString(includeFieldNames = false)。
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Persona { private String nombre; }
允許您從類別的所有屬性產生 equals() 和 hashCode() 方法,如果您想要排除或包含某個屬性,可以使用註解 @EqualsAndHashCode.Exclude 和 @EqualsAndHashCode.Include 來實作。分別。
import lombok.*; @Getter @Setter public class Persona { private String nombre; private String apellido; }
以前,在 Java 中建立不可變類別需要執行一系列步驟,例如使類別和/或屬性成為最終類型,並且不會產生 setter 方法。 Lombok 使我們可以輕鬆地使用 @Value 註解創建不可變類,該註解結合了 @Getter、@ToString、@EqualsAndHashCode 和 @AllArgsConstructor 註解來產生不可變類。所有屬性都標記為 private Final,並且不會產生 setter 方法。它是 @Data 的不可變變體。
import lombok.*; public class Persona { @Getter @Setter private String nombre; private String apellido; }
在 Java 的最新版本中,與使用記錄相比,此註解失去了意義,因為它們具有相同的目的,並且使用記錄更實用。如果您有興趣了解更多有關此主題的信息,部落格上還有更多有關記錄的帖子。
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.36</version> <scope>provided</scope> </dependency> </dependencies>
這個註解允許我們將一個變數宣告為final並自動推斷它的資料類型,也就是說,不需要指定變數的資料類型,Lombok會負責推斷它。如果變數資料類型很長或很複雜,它很有用,這樣可以避免重複。
import lombok.Data; @Data public class Persona { private String nombre; }
如果我們直接使用final var或簡單的var進行型別推斷,這個註解可能會失去意義,因為這是語言的特性,這樣比較方便。如果您有興趣了解更多,可以參考以下帖子
public class Main { public static void main(String[] args) { Persona p1 = new Persona(); p2.setNombre("Maria"); System.out.println(p1.getNombre()); } }
它的工作方式與@val完全相同,但它不將變數宣告為final,它只是推斷其類型。有必要考慮類型推斷的概念,因為您不能聲明 String 類型的內容,並且想要為其分配 int 類型的值也不是最終的。同樣,在最新版本的 Java 中,該註解被 var 取代。
import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Persona { private String nombre; }
這個註解可以用在類別的屬性和方法的參數上,它基本上表明屬性的值不能為空,如果嘗試將空值分配給標記為@NonNull的屬性,它會拋出NullPointerException,即使用if (param == null) throw new NullPointerException("param is tagged non-null but is null"); 。無論它產生什麼異常,它的使用在 IDE 本身中都更加明顯,因為它會以某種方式向我們表明該值不能為空。
import lombok.*; @Getter @Setter public class Persona { private String nombre; private String apellido; }
此註解可讓我們確保任何使用它的資源(如果它具有 close() 方法或實作 AutoCloseable 或 Closeable 介面)都會在其所在程式碼區塊的末尾自動關閉。它在處理需要釋放的資源時非常有用,例如檔案、資料庫連接等。
import lombok.*; public class Persona { @Getter @Setter private String nombre; private String apellido; }
如果我們使用資源嘗試,可以手動獲得此結果。
import lombok.*; @AllArgsConstructor @ToString public class Persona { private String nombre; @ToString.Exclude private String apellido; } // Output: Persona(nombre=Maria)
這個註解可以讓我們自動產生一個設計模式Builder,即一個可以讓我們一步步構建複雜對象的對象,這樣就可以配置一個對象的不同屬性,而無需調用帶有多個參數的建構子。如果一個類別有很多屬性並且我們不希望有一個帶有許多參數的建構函數,那麼它很有用。
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.36</version> <scope>provided</scope> </dependency> </dependencies>
這個註解允許我們建立一個方法,該方法傳回帶有修改屬性的目前物件的副本,即它產生一個方法withAttributeName(Object object) ,該方法允許我們用該物件建立目前物件的副本屬性由我們作為參數傳遞的值修改。當我們想要修改物件的屬性而不修改原始物件時,它非常有用。
import lombok.Data; @Data public class Persona { private String nombre; }
public class Main { public static void main(String[] args) { Persona p1 = new Persona(); p2.setNombre("Maria"); System.out.println(p1.getNombre()); } }
到目前為止,我們已經看到了一些最常用的註釋,每個註釋可能接受也可能不接受額外的配置,同樣還有其他註釋被標記為實驗性的,無論如何,參考很重要官方文檔,以充分利用Lombok 為我們提供的所有功能以及重複程式碼產生的優勢。
以上是Java 中的 Lombok 項目的詳細內容。更多資訊請關注PHP中文網其他相關文章!