Penulis: Michael Karneim
Beranda Proyek: http://github.com/mkarneim/pojobuilder
PojoBuilder Generator adalah pemroses anotasi yang sesuai dengan Java 6 yang menghasilkan kelas pembangun yang lancar untuk POJO (Plain Old Java Object).
Pembangun yang dihasilkan menyediakan
Berikut adalah contoh bagaimana Anda dapat menggunakan pembuat pojo yang dihasilkan dari kode Anda:
Contact james = new ContactBuilder ()
. withSurname ( "Bond" )
. withFirstname ( "James" )
. withEmail ( "[email protected]" )
. build ();
Builder cukup berguna, misalnya untuk membuat data pengujian, yang mana Anda hanya ingin mengatur properti data yang relevan.
Untuk informasi lebih lanjut tentang
Kode sumber yang terletak di direktori "src" ada di DOMAIN PUBLIK. Untuk informasi lebih lanjut silakan baca COPYING file.
PojoBuilder adalah pembuat kode murni. Itu tidak menambahkan ketergantungan runtime apa pun ke proyek Anda.
Namun, PojoBuilder menambahkan ketergantungan waktu kompilasi berikut ke proyek Anda, yang memiliki lisensinya sendiri:
PojoBuilder adalah Sumber Terbuka. Kode sumber tersedia di http://github.com/mkarneim/pojobuilder. Untuk versi yang lebih lama dan log perubahan, silakan lihat halaman riwayat rilis.
Biner PojoBuilder tersedia untuk diunduh di Repositori Maven Sonatype OSS dan Maven Central.
Jika Anda tidak menggunakan alat otomatisasi build apa pun yang mendukung repo maven, Anda mungkin ingin mengunduh pojobuilder-4.3.0-jar-with-dependencies.jar
untuk mendapatkan PojoBuilder lengkap dengan semua pustaka dependen yang disertakan.
Generator PojoBuilder menggunakan pemroses anotasi untuk menghasilkan pembuat pojo untuk Anda. Anda memiliki opsi berikut untuk memicu pembuatan kode:
Untuk menghasilkan kelas pembangun untuk pojo, Anda dapat memberi anotasi pada salah satu konstruktornya dengan @GeneratePojoBuilder
.
Mari kita lihat contoh pojo berikut:
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 ;
}
}
Anotasi @GeneratePojoBuilder memberi tahu pemroses anotasi untuk membuat file sumber Java baru dengan nama ContactBuilder
. Lihat ContactBuilder.java
untuk melihat kode sumber yang dihasilkan.
Harap dicatat bahwa konstruktor harus bersifat publik atau dapat diakses oleh pembuat yang dihasilkan, misalnya jika dilindungi, pembuat yang dihasilkan harus berada dalam paket yang sama.
Dan perhatikan juga bahwa nama parameter konstruktor harus sama persis dengan nama properti pojo.
Anotasi @ConstructorProperties opsional dapat digunakan untuk menentukan pemetaan dari nama parameter konstruktor ke nama properti kacang yang sesuai pada pojo jika berbeda.
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 ;
}
}
Jika pojo Anda tidak memiliki konstruktor (atau konstruktor default publik), Anda dapat memberi anotasi pada kelasnya dengan @GeneratePojoBuilder
.
Mari kita lihat contoh pojo berikut:
@ 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 ;
}
}
Lihat UserBuilder.java
untuk melihat kode sumber yang dihasilkan.
Alternatifnya, jika Anda tidak memiliki akses ke kode sumber pojo, atau jika Anda bukan penggemar membuat anotasi pada pojo, Anda dapat membuat anotasi dengan metode pabrik:
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 );
}
}
Lihat UrlBuilder.java
untuk melihat kode sumber yang dihasilkan.
Harap dicatat bahwa metode pabrik harus public dan static . Nama parameter metode harus sama persis dengan nama properti pojo.
Anotasi @FactoryProperties opsional dapat digunakan untuk menentukan pemetaan dari nama parameter metode pabrik ke nama properti kacang yang sesuai di pojo jika berbeda.
public class FileFactory {
@ GeneratePojoBuilder ( intoPackage = "samples" )
@ FactoryProperties ({ "path" })
public static File createFile ( String arg1 ) {
return new File ( arg1 );
}
}
Lihat FileBuilder.java
untuk melihat kode sumber yang dihasilkan.
Dimulai dengan PojoBuilder 4.3 Anda dapat memberi anotasi pada jenis data Java 17:
@ GeneratePojoBuilder
public record MyRecord ( int x , int y , String blah ) {}
Elemen @GeneratePojoBuilder berikut dapat digunakan untuk mengonfigurasi keluaran proses pembuatan kode.
Fluent*Builder
akan menjadi FluentContactBuilder
jika nama pojonya adalah Contact
. Pola defaultnya adalah *Builder
.Visibility.PUBLIC
.*.util
akan menjadi com.example.util
jika paket pojo adalah com.example
. Pola defaultnya adalah *
.Object.class
.Address.java
, Builder.java
dan AddressBuilder.java
. Defaultnya adalah Void.class
, yang berarti, tidak ada antarmuka yang harus diimplementasikan.Recipient.java
, Builder.java
dan RecipientBuilder.java
. Standarnya false
.InputSourceFactory.java
dan InputSourceBuilder.java
. Standarnya adalah *
.CalendarFactory.java
dan GregorianCalendarBuilder.java
. Defaultnya adalah array kosong.Player.java
, PlayerBuilder.java
, dan AbstractPlayerBuilder.java
. Standarnya false
.TextEmail.java
dan TextEmailBuilder.java
. Standarnya false
.com.google.common.base.Optional
dan java.util.Optional
dari Google Guava yang diperkenalkan dengan Java 8. Defaultnya adalah Void.class
, yang berarti, tidak ada metode penyetel berbasis opsional yang dihasilkan.with*
.validate
yang memiliki satu parameter yang kompatibel dengan tipe pojo. Jika validasi gagal, metode harus mengeluarkan beberapa pengecualian runtime (atau salah satu subkelasnya). Sebagai contoh silakan lihat Credentials.java
, CredentialsValidator.java
dan CredentialsBuilder.java
.Task.java
dan TaskBuilder.java
. Defaultnya adalah ""
yang berarti tidak menghasilkan metode ini.Dimulai dengan versi 3, PojoBuilder mendukung meta-annotations . Artinya, Anda dapat menempatkan @GeneratePojoBuilder ke anotasi lain dan anotasi tersebut akan diwarisi.
Keuntungannya adalah:
Contoh berikut mendefinisikan @AppPojo
yang dapat diterapkan di tingkat kelas dan merangkum anotasi dari tiga sumber berbeda (PojoBuilder, Lombok, dan 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 {
}
Ini dapat ditempatkan ke setiap pojo Anda:
@ AppPojo
public class Contact {
public String name ;
}
PojoBuilder akan menghasilkan FluentContactBuilder
berdasarkan arahan yang diwarisi dari anotasi @AppPojo
.
Default yang diwarisi dari anotasi meta dapat diganti dengan anotasi @GeneratePojoBuilder
yang lebih 'lokal':
@ AppPojo
@ GeneratePojoBuilder ( intoPackage = "builder" )
public class Contact {
public String name ;
}
Ini akan menghasilkan FluentContactBuilder
seperti sebelumnya tetapi ke dalam builder
paket.
Wiki PojoBuilder menyediakan buku masak tentang penggunaan Generator PojoBuilder, misalnya untuk membangun bahasa khusus domain untuk pengujian otomatis.
Untuk beberapa contoh kode lengkap silakan lihat di folder src/testdata/java/samples.
Untuk menjalankan pemroses anotasi PojoBuilder Anda hanya perlu memasukkannya ke dalam classpath waktu kompilasi. Selama runtime, tidak ada perpustakaan yang diperlukan karena kebijakan penyimpanan anotasi PojoBuilder adalah CLASS
.
Berikut adalah daftar penjelasan singkat tentang cara menjalankan PojoBuilder dengan
Kompiler javac
akan secara otomatis mendeteksi keberadaan PojoBuilder jika pojobuilder-*.jar
disertakan dalam classpath.
Misalnya:
javac -cp pojobuilder-4.3.0-jar-with-dependencies.jar Contact.java
akan menghasilkan ContactBuilder
jika Contact
dianotasi dengan @GeneratePojoBuilder
.
Untuk informasi lebih lanjut lihat dokumentasi javac.
Tambahkan kode berikut ke pom.xml
proyek Anda untuk mengonfigurasi pemroses anotasi PojoBuilder.
net.karneim
pojobuilder
4.3.0
provided
Catatan:
${project.build.directory}/generated-sources/annotations
.target
, konfigurasikan generatedSourcesDirectory
dari maven-compiler-plugin
. Lihat contoh pom Maven sebagai contoh.Ini adalah skrip build kecil yang menunjukkan cara menjalankan prosesor anotasi PojoBuilder dengan Gradle.
apply plugin : ' java '
repositories {
mavenCentral()
}
dependencies {
compile ' net.karneim:pojobuilder:4.3.0 '
}
Harap dicatat bahwa ini tidak hanya menambahkan PojoBuilder dan dependensinya ke jalur kelas waktu kompilasi Anda, tetapi juga ke jalur kelas waktu proses Anda.
Alternatifnya, Anda dapat menggunakan skrip berikut untuk menambahkan PojoBuilder hanya ke jalur kelas waktu kompilasi:
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
Dalam kedua kasus tersebut, sumber yang dihasilkan akan ditempatkan ke dalam direktori build/classes
standar.
Jika Anda ingin meletakkannya di tempat lain, cukup tentukan tujuannya seperti ini:
compileJava . options . compilerArgs + = [ ' -s ' , ' src/generated/java ' ]
Wiki berisi skrip Gradle yang diperluas yang membedakan sepenuhnya antara tugas pembuatan kode dan kompilasi.
Ada skrip Gradle lain yang mengaktifkan PojoBuilder untuk Eclipse IDE.
Dengan Gradle 5.0, prosesor anotasi apa pun di classpath tidak akan dieksekusi lagi. Agar pojobuilder berfungsi kembali, ganti cakupan ketergantungan yang digunakan dengan annotationProcessor
dependencies {
annotationProcessor ' net.karneim:pojobuilder:4.3.0 '
}
Berikut cuplikan kode dari beberapa contoh skrip build ANT yang menjalankan pemroses anotasi PojoBuilder dalam tugas javac
.
< 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 >
Anda juga dapat mengonfigurasi Eclipse untuk menjalankan prosesor anotasi PojoBuilder selama siklus pembangunan. Ini akan dipanggil setiap kali Anda menyimpan file yang berisi sumber yang dianotasi dengan @GeneratePojoBuilder
.
Lakukan hal berikut untuk mengaktifkan PojoBuilder untuk proyek Eclipse Anda:
pojobuilder-4.3.0-annotations.jar
ke classpath proyek Andapojobuiler-4.3.0-jar-with-dependencies.jar
Jika Anda ingin mengkompilasi sendiri sumber proyek ini, Anda dapat menggunakan Gradle (lihat build.gradle).