作者:麥可‧卡尼姆
專案首頁:http://github.com/mkarneim/pojobuilder
PojoBuilder Generator 是一個符合 Java 6 的註解處理器,可為 POJO(普通舊 Java 物件)產生流暢的建構器類別。
生成的建構器提供
以下是如何使用程式碼產生的 pojo 建構器的範例:
Contact james = new ContactBuilder ()
. withSurname ( "Bond" )
. withFirstname ( "James" )
. withEmail ( "[email protected]" )
. build ();
建構器非常有用,例如,建立測試數據,您只想設定相關的數據屬性。
欲了解更多信息
位於「src」目錄中的原始碼位於公共域中。有關更多信息,請閱讀複製文件。
PojoBuilder 是一個純程式碼產生器。它不會向您的專案添加任何運行時依賴項。
但是,PojoBuilder 將以下編譯時依賴項新增至您的專案中,該專案有自己的授權:
PojoBuilder 是開源的。原始碼可在 http://github.com/mkarneim/pojobuilder 取得。對於舊版本和變更日誌,請參閱發布歷史記錄頁面。
PojoBuilder二進位檔案可從 Sonatype OSS Maven 儲存庫和 Maven Central 下載。
如果您不使用任何支援 Maven 儲存庫的建置自動化工具,您可能需要下載pojobuilder-4.3.0-jar-with-dependencies.jar
以取得包含所有依賴函式庫的完整 PojoBuilder。
PojoBuilder 產生器使用註解處理器為您產生 pojo 建構器。您可以使用以下選項來觸發程式碼產生:
若要為 pojo 產生建構器類,您可以使用@GeneratePojoBuilder
註解其建構函式之一。
讓我們來看看下面的 pojo 範例:
public class Contact {
private final String surname ;
private final String firstname ;
private String email ;
@ GeneratePojoBuilder
public Contact ( String surname , String firstname ) {
this . surname = surname ;
this . firstname = firstname ;
}
public String getEmail () {
return email ;
}
public void setEmail ( String email ) {
this . email = email ;
}
public String getSurname () {
return surname ;
}
public String getFirstname () {
return firstname ;
}
}
@GeneratePojoBuilder 註解告訴註解處理器建立一個名為ContactBuilder
的新 Java 原始檔。查看ContactBuilder.java
以查看產生的原始程式碼。
請注意,建構函式必須是公共的,或者以其他方式可供產生的建構器訪問,例如,如果它受保護,則產生的建構器必須駐留在同一包中。
另請注意,建構函數參數名稱必須與 pojo 的屬性名稱完全匹配。
可選的 @ConstructorProperties 註解可用於指定從建構函式參數名稱到 pojo 上對應 bean 屬性名稱的對應(如果它們不同)。
public class Contact {
private final String surname ;
private final String firstname ;
private String email ;
@ GeneratePojoBuilder
@ ConstructorProperties ({ "surname" , "firstname" })
public Contact ( String arg1 , String arg2 ) {
this . surname = arg1 ;
this . firstname = arg2 ;
}
public String getEmail () {
return email ;
}
public void setEmail ( String email ) {
this . email = email ;
}
public String getSurname () {
return surname ;
}
public String getFirstname () {
return firstname ;
}
}
如果您的 pojo 沒有建構子(或公共預設建構子),您可以使用@GeneratePojoBuilder
註解其類別。
讓我們來看看下面的 pojo 範例:
@ GeneratePojoBuilder
public class User {
private String name ;
private char [] password ;
public String getName () {
return name ;
}
public void setName ( String name ) {
this . name = name ;
}
public char [] getPassword () {
return password ;
}
public void setPassword ( char [] password ) {
this . password = password ;
}
}
查看UserBuilder.java
以查看產生的原始碼。
或者,如果您無法存取 pojo 的原始程式碼,或者如果您不喜歡註釋 pojo,則可以註釋工廠方法:
public class UrlFactory {
@ GeneratePojoBuilder ( withName = "UrlBuilder" , intoPackage = "samples" )
public static URL createUrl (
String protocol , String host , int port , String file , URLStreamHandler handler )
throws MalformedURLException {
return new URL ( protocol , host , port , file , handler );
}
}
查看UrlBuilder.java
以查看產生的原始碼。
請注意,工廠方法必須是public和static 的。方法參數名稱必須與 pojo 屬性的名稱完全相符。
可選的 @FactoryProperties 註解可用於指定從工廠方法參數名稱到 pojo 上對應 bean 屬性名稱的對應(如果它們不同)。
public class FileFactory {
@ GeneratePojoBuilder ( intoPackage = "samples" )
@ FactoryProperties ({ "path" })
public static File createFile ( String arg1 ) {
return new File ( arg1 );
}
}
查看FileBuilder.java
以查看產生的原始程式碼。
從 PojoBuilder 4.3 開始,您可以註解 Java 17 記錄類型:
@ GeneratePojoBuilder
public record MyRecord ( int x , int y , String blah ) {}
@GeneratePojoBuilder 的以下元素可用於設定程式碼產生過程的輸出。
Contact
則模式Fluent*Builder
的結果將變成FluentContactBuilder
。預設模式是*Builder
。Visibility.PUBLIC
。com.example
,則模式*.util
的結果將變為com.example.util
。預設模式是*
。Object.class
。Address.java
、 Builder.java
和AddressBuilder.java
。預設值為Void.class
,這表示不應實作任何介面。Recipient.java
、 Builder.java
和RecipientBuilder.java
。預設為false
。InputSourceFactory.java
和InputSourceBuilder.java
。預設為*
。CalendarFactory.java
和GregorianCalendarBuilder.java
。預設為空數組。Player.java
、 PlayerBuilder.java
和AbstractPlayerBuilder.java
。預設為false
。TextEmail.java
和TextEmailBuilder.java
。預設為false
。com.google.common.base.Optional
和Void.class
java.util.Optional
with*
。validate
方法,該方法具有與 pojo 類型相容的參數。如果驗證失敗,則該方法必須拋出一些運行時異常(或其子類別之一)。有關範例,請參閱Credentials.java
、 CredentialsValidator.java
和CredentialsBuilder.java
。Task.java
和TaskBuilder.java
。預設為""
表示不產生此方法。從版本 3 開始,PojoBuilder 支援元註解。也就是說,您可以將 @GeneratePojoBuilder 放置到另一個註釋上,它將被繼承。
優點是:
以下範例定義了@AppPojo
它可以在類別層級套用並封裝來自三個不同來源(PojoBuilder、Lombok 和 JSR-305)的註解。
@ GeneratePojoBuilder ( withName = "Fluent*Builder" )
@ lombok . experimental . Value // class-level annotation from Lombok
@ javax . annotation . concurrent . Immutable // class-level annotation from JSR-305
@ Target ({ ElementType . TYPE , ElementType . ANNOTATION_TYPE })
public @interface AppPojo {
}
這可以放置到您的每個 pojo 上:
@ AppPojo
public class Contact {
public String name ;
}
PojoBuilder 將根據從@AppPojo
註解繼承的指令產生FluentContactBuilder
。
從元註釋繼承的預設值可以被更多「本地」 @GeneratePojoBuilder
註釋覆蓋:
@ AppPojo
@ GeneratePojoBuilder ( intoPackage = "builder" )
public class Contact {
public String name ;
}
這將像以前一樣產生FluentContactBuilder
,但生成到套件builder
。
PojoBuilder wiki 提供了一本有關使用 PojoBuilder Generator 的手冊,例如用於建立用於自動化測試的特定於網域的語言。
有關一些完整的程式碼範例,請查看 src/testdata/java/samples 資料夾。
要執行 PojoBuilder 註解處理器,您只需將其放入編譯時類路徑中。在執行時不需要任何函式庫,因為 PojoBuilder 註解的保留策略是CLASS
。
以下是有關如何運行 PojoBuilder 的簡要說明列表
如果類別路徑中包含pojobuilder-*.jar
javac
編譯器將自動偵測 PojoBuilder 的存在。
例如:
javac -cp pojobuilder-4.3.0-jar-with-dependencies.jar Contact.java
如果Contact
用@GeneratePojoBuilder
註釋,將產生一個ContactBuilder
。
有關詳細信息,請參閱 javac 文件。
將以下內容新增至專案的pom.xml
中以配置 PojoBuilder 註解處理器。
net.karneim
pojobuilder
4.3.0
provided
筆記:
${project.build.directory}/generated-sources/annotations
。target
目錄以外的特定目錄中,請設定maven-compiler-plugin
的generatedSourcesDirectory
。有關範例,請參閱範例 Maven pom。這是一個小型建置腳本,展示如何使用 Gradle 執行 PojoBuilder 註解處理器。
apply plugin : ' java '
repositories {
mavenCentral()
}
dependencies {
compile ' net.karneim:pojobuilder:4.3.0 '
}
請注意,這不僅將 PojoBuilder 及其相依性新增至編譯時類別路徑,而且還新增至執行時類別路徑。
或者,您可以使用以下腳本將 PojoBuilder 僅新增至編譯時類路徑:
apply plugin : ' java '
repositories {
mavenCentral()
}
configurations {
codeGeneration
}
dependencies {
codeGeneration ' net.karneim:pojobuilder:4.3.0 '
compileOnly ' net.karneim:pojobuilder:4.3.0:annotations '
}
compileJava . classpath + = configurations . codeGeneration
compileTestJava . classpath + = configurations . codeGeneration
在這兩種情況下,產生的來源都會被放入標準的build/classes
目錄中。
如果你想把它們放在其他地方,只需指定目的地,如下所示:
compileJava . options . compilerArgs + = [ ' -s ' , ' src/generated/java ' ]
該 wiki 包含一個擴充的 Gradle 腳本,可以完全區分程式碼產生和編譯任務。
還有另一個 Gradle 腳本可以為 Eclipse IDE 啟用 PojoBuilder。
使用 Gradle 5.0,類別路徑中的任何註解處理器都不再執行。為了讓pojobuilder再次運作,用annotationProcessor
取代使用的依賴範圍
dependencies {
annotationProcessor ' net.karneim:pojobuilder:4.3.0 '
}
以下是一些範例 ANT 建置腳本的程式碼片段,該腳本在javac
任務中執行 PojoBuilder 註解處理器。
< fileset id = " libs.fileset " dir = " ${basedir}/lib " >
< include name = " *.jar " />
fileset >
< path id = " class.path " >
< fileset refid = " libs.fileset " />
path >
< target name = " compile " depends = " init "
description = " Compile java sources and run annotation processor " >
< mkdir dir = " ${src.gen.java.dir} " />
< mkdir dir = " ${build.classes.dir} " />
< javac classpathref = " class.path " destdir = " ${build.classes.dir} " >
< src path = " ${src.main.java.dir} " />
< compilerarg line = " -s ${src.gen.java.dir} " />
javac >
target >
您也可以將 Eclipse 配置為在建置週期中執行 PojoBuilder 註解處理器。每當您保存包含使用@GeneratePojoBuilder
註釋的來源的檔案時,都會呼叫它。
執行以下操作為您的 Eclipse 專案啟用 PojoBuilder:
pojobuilder-4.3.0-annotations.jar
加入到專案類別路徑中pojobuiler-4.3.0-jar-with-dependencies.jar
如果您想自行編譯該專案的原始程式碼,您可以使用 Gradle(請參閱 build.gradle)。