著者: マイケル・カーネイム
プロジェクトのホームページ: http://github.com/mkarneim/pojobuilder
PojoBuilder ジェネレーターは、POJO (Plain Old Java Object) の流暢なビルダー クラスを生成する Java 6 準拠のアノテーション プロセッサです。
生成されたビルダーが提供するのは、
コードから生成された pojo ビルダーを使用する方法の例を次に示します。
Contact james = new ContactBuilder ()
. withSurname ( "Bond" )
. withFirstname ( "James" )
. withEmail ( "[email protected]" )
. build ();
ビルダーは、たとえば、関連するデータ プロパティのみを設定する必要があるテスト データを構築する場合に非常に役立ちます。
詳細については、
「src」ディレクトリにあるソース コードは PUBLIC DOMAIN にあります。詳細については、COPYING ファイルを参照してください。
PojoBuilder は純粋なコードジェネレーターです。プロジェクトに実行時の依存関係は追加されません。
ただし、PojoBuilder は、独自のライセンスを持つ次のコンパイル時の依存関係をプロジェクトに追加します。
PojoBuilder はオープンソースです。ソース コードはhttp://github.com/mkarneim/pojobuilder で入手できます。古いバージョンと変更ログについては、リリース履歴ページを参照してください。
PojoBuilderバイナリは、Sonatype OSS Maven Repository および Maven Central からダウンロードできます。
Maven リポジトリをサポートするビルド自動化ツールを使用していない場合は、 pojobuilder-4.3.0-jar-with-dependencies.jar
ダウンロードして、すべての依存ライブラリを含む完全な PojoBuilder を入手するとよいでしょう。
PojoBuilder ジェネレーターは、アノテーション プロセッサーを使用して Pojo ビルダーを生成します。コード生成をトリガーするには、次のオプションがあります。
Pojo のビルダー クラスを生成するには、そのコンストラクターの 1 つに@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 アノテーションを使用して、constructor-parameter-names から pojo 上の対応する Bean-property-names へのマッピングを指定できます (それらが異なる場合)。
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 アノテーションを使用して、factory-method-parameter-names から pojo 上の対応する Bean-property-names へのマッピングを指定できます (それらが異なる場合)。
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
とjava.util.Optional
があります。デフォルトはVoid.class
で、オプション ベースの setter メソッドは生成されません。with*
です。validate
メソッドを定義する必要があります。検証が失敗した場合、メソッドは実行時例外 (またはそのサブクラスの 1 つ) をスローする必要があります。例については、 Credentials.java
、 CredentialsValidator.java
、およびCredentialsBuilder.java
を参照してください。Task.java
およびTaskBuilder.java
を参照してください。デフォルトは""
で、このメソッドを生成しないことを意味します。バージョン 3 以降、PojoBuilder はメタアノテーションをサポートします。つまり、@GeneratePojoBuilder を別のアノテーションに配置すると、それが継承されます。
利点は次のとおりです。
次の例では、クラス レベルで適用できる@AppPojo
を定義し、3 つの異なるソース (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 {
}
これは各ポジョに配置できます。
@ 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 ジェネレーターの使用に関するクックブックを提供します。
完全なコード例については、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 を参照してください。これは、PojoBuilder アノテーション プロセッサを Gradle で実行する方法を示す小さなビルド スクリプトです。
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 スクリプトが含まれています。
Eclipse IDE 用に PojoBuilder を有効にする別の Gradle スクリプトがあります。
Gradle 5.0 では、クラスパス内のアノテーション プロセッサは実行されなくなりました。 pojobuilder を再び動作させるには、使用されている依存関係スコープをannotationProcessor
に置き換えます。
dependencies {
annotationProcessor ' net.karneim:pojobuilder:4.3.0 '
}
以下は、 javac
タスク内で PojoBuilder アノテーション プロセッサを実行するサンプル ANT ビルド スクリプトのコード スニペットです。
< 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 >
ビルド サイクル中に PojoBuilder アノテーション プロセッサを実行するように Eclipse を構成することもできます。 @GeneratePojoBuilder
の注釈が付けられたソースを含むファイルを保存するたびに呼び出されます。
Eclipse プロジェクトで PojoBuilder を有効にするには、次の手順を実行します。
pojobuilder-4.3.0-annotations.jar
をプロジェクトのクラスパスに追加しますpojobuiler-4.3.0-jar-with-dependencies.jar
を追加このプロジェクトのソースを自分でコンパイルしたい場合は、Gradle を使用できます (build.gradle を参照)。