ผู้เขียน : ไมเคิล คาร์นีม
หน้าแรกของโครงการ: http://github.com/mkarneim/pojobuilder
PojoBuilder Generator เป็นตัวประมวลผลคำอธิบายประกอบที่สอดคล้องกับ Java 6 ซึ่งสร้างคลาสตัวสร้างที่คล่องแคล่วสำหรับ POJO (Plain Old Java Object)
ผู้สร้างที่สร้างขึ้นให้
นี่คือตัวอย่างวิธีที่คุณสามารถใช้ pojo builder ที่สร้างขึ้นจากโค้ดของคุณ:
Contact james = new ContactBuilder ()
. withSurname ( "Bond" )
. withFirstname ( "James" )
. withEmail ( "[email protected]" )
. build ();
ตัวสร้างค่อนข้างมีประโยชน์ เช่น ในการสร้างข้อมูลทดสอบ โดยที่คุณต้องการตั้งค่าคุณสมบัติข้อมูลที่เกี่ยวข้องเท่านั้น
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ
ซอร์สโค้ดที่อยู่ในไดเรกทอรี "src" อยู่ในโดเมนสาธารณะ สำหรับข้อมูลเพิ่มเติม โปรดอ่านไฟล์ COPYING
PojoBuilder เป็นตัวสร้างโค้ดล้วนๆ มันไม่ได้เพิ่มการพึ่งพารันไทม์ให้กับโปรเจ็กต์ของคุณ
อย่างไรก็ตาม PojoBuilder จะเพิ่มการพึ่งพา เวลาคอมไพล์ ต่อไปนี้ให้กับโปรเจ็กต์ของคุณ ซึ่งมีใบอนุญาตของตัวเอง:
PojoBuilder เป็นโอเพ่นซอร์ส มี ซอร์สโค้ด อยู่ที่ http://github.com/mkarneim/pojobuilder สำหรับเวอร์ชันเก่าและ บันทึกการเปลี่ยนแปลง โปรดดูที่หน้าประวัติการเผยแพร่
ไบนารี PojoBuilder พร้อมให้ดาวน์โหลดแล้วที่ Sonatype OSS Maven Repository และ Maven Central
หากคุณไม่ได้ใช้เครื่องมือสร้างอัตโนมัติใดๆ ที่รองรับ maven repos คุณอาจต้องการดาวน์โหลด 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 บอกให้ตัวประมวลผลคำอธิบายประกอบสร้างซอร์สไฟล์ Java ใหม่ที่มีชื่อ ContactBuilder
ดูที่ ContactBuilder.java
เพื่อดูซอร์สโค้ดที่สร้างขึ้น
โปรดทราบว่าตัวสร้างจะต้องเป็น แบบสาธารณะ หรือสามารถเข้าถึงได้สำหรับตัวสร้างที่สร้างขึ้น เช่น หากได้ รับการคุ้มครอง ตัวสร้างที่สร้างขึ้นจะต้องอยู่ในแพ็คเกจเดียวกัน
และโปรดทราบว่าชื่อพารามิเตอร์ Constructor จะต้องตรงกับชื่อของคุณสมบัติของ pojo ทุกประการ
คำอธิบายประกอบ @ConstructorProperties ที่เป็นทางเลือกสามารถใช้เพื่อระบุการแมปจากชื่อคอนสตรัคเตอร์-พารามิเตอร์ ไปยังชื่อคุณสมบัติ bean ที่สอดคล้องกันบน pojo หากต่างกัน
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 ของคุณไม่มี Constructor (หรือ Constructor เริ่มต้นสาธารณะ) คุณสามารถใส่คำอธิบายประกอบ คลาส ด้วย @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
เพื่อดูซอร์สโค้ดที่สร้างขึ้น
โปรดทราบว่าวิธีการของโรงงานจะต้องเป็น แบบสาธารณะ และ เป็นแบบคงที่ ชื่อพารามิเตอร์เมธอดต้องตรงกับชื่อของคุณสมบัติของ pojo ทุกประการ
คำอธิบายประกอบ @FactoryProperties ที่เป็นตัวเลือกสามารถใช้เพื่อระบุการแมปจากชื่อพารามิเตอร์วิธีโรงงานไปยังชื่อ bean-property ที่สอดคล้องกันบน pojo หากต่างกัน
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 สามารถใช้เพื่อกำหนดค่าเอาต์พุตของกระบวนการสร้างโค้ด
Fluent*Builder
จะกลายเป็น FluentContactBuilder
หากชื่อของ pojo คือ Contact
รูปแบบเริ่มต้นคือ *Builder
Visibility.PUBLIC
*.util
จะกลายเป็น com.example.util
หากแพ็คเกจของ pojo คือ com.example
รูปแบบเริ่มต้นคือ *
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
ของ Google Guava ที่นำมาใช้กับ Java 8 ค่าเริ่มต้นคือ Void.class
ซึ่งหมายความว่าไม่มีการสร้างเมธอด setter แบบทางเลือกwith*
validate
โดยมีพารามิเตอร์หนึ่งตัวที่เข้ากันได้กับประเภทของ pojo หากการตรวจสอบล้มเหลว วิธีการจะต้องส่งข้อยกเว้นรันไทม์บางอย่าง (หรือคลาสย่อยอย่างใดอย่างหนึ่ง) สำหรับตัวอย่าง โปรดดูที่ Credentials.java
, CredentialsValidator.java
และ CredentialsBuilder.java
Task.java
และ TaskBuilder.java
ค่าเริ่มต้นคือ ""
หมายถึงไม่ต้องสร้างวิธีนี้ตั้งแต่เวอร์ชัน 3 เป็นต้นไป PojoBuilder รองรับ meta-annotations นั่นคือคุณสามารถวาง @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 {
}
สามารถวางลงบน pojos แต่ละรายการของคุณได้:
@ AppPojo
public class Contact {
public String name ;
}
PojoBuilder จะสร้าง FluentContactBuilder
ตามคำสั่งที่สืบทอดมาจากคำอธิบายประกอบ @AppPojo
ค่าเริ่มต้นที่สืบทอดมาจากคำอธิบายประกอบเมตาสามารถแทนที่ได้ด้วยคำอธิบายประกอบ @GeneratePojoBuilder
'ท้องถิ่น' เพิ่มเติม:
@ AppPojo
@ GeneratePojoBuilder ( intoPackage = "builder" )
public class Contact {
public String name ;
}
สิ่งนี้จะสร้าง FluentContactBuilder
เหมือนเมื่อก่อน แต่เป็นการ builder
แพ็คเกจ
วิกิ PojoBuilder จัดทำตำราเกี่ยวกับการใช้ PojoBuilder Generator เช่น การสร้างภาษาเฉพาะโดเมนสำหรับการทดสอบอัตโนมัติ
สำหรับตัวอย่างโค้ดที่สมบูรณ์บางส่วน โปรดดูที่โฟลเดอร์ src/testdata/java/samples
ในการรันตัวประมวลผลคำอธิบายประกอบ PojoBuilder คุณเพียงแค่ใส่มันลงใน classpath ของเวลาคอมไพล์ ในระหว่างรันไทม์ ไม่จำเป็นต้องมีไลบรารีเนื่องจากนโยบายการเก็บรักษาคำอธิบายประกอบของ PojoBuilder คือ CLASS
นี่คือรายการคำอธิบายสั้นๆ เกี่ยวกับวิธีการรัน PojoBuilder
คอมไพลเลอร์ javac
จะตรวจจับการมีอยู่ของ PojoBuilder โดยอัตโนมัติ หากรวม pojobuilder-*.jar
ไว้ใน classpath
ตัวอย่างเช่น:
javac -cp pojobuilder-4.3.0-jar-with-dependencies.jar Contact.java
จะสร้าง ContactBuilder
หาก Contact
มีคำอธิบายประกอบด้วย @GeneratePojoBuilder
สำหรับข้อมูลเพิ่มเติม โปรดดูเอกสารประกอบ javac
เพิ่มสิ่งต่อไปนี้ใน pom.xml
ของโปรเจ็กต์ของคุณเพื่อกำหนดค่าตัวประมวลผลคำอธิบายประกอบ PojoBuilder
net.karneim
pojobuilder
4.3.0
provided
หมายเหตุ:
${project.build.directory}/generated-sources/annotations
target
ให้กำหนดค่าสร้าง generatedSourcesDirectory
ของ maven-compiler-plugin
ดูตัวอย่าง 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 ' ]
วิกิมีสคริปต์ Gradle แบบขยายที่แยกความแตกต่างระหว่างงานสร้างโค้ดและงานคอมไพล์โดยสิ้นเชิง
มีสคริปต์ Gradle อื่นที่เปิดใช้งาน PojoBuilder สำหรับ Eclipse IDE
ด้วย Gradle 5.0 ตัวประมวลผลคำอธิบายประกอบใน classpath จะไม่ถูกดำเนินการอีกต่อไป หากต้องการให้ pojobuilder ทำงานอีกครั้ง ให้แทนที่ขอบเขตการพึ่งพาที่ใช้ด้วย annotationProcessor
dependencies {
annotationProcessor ' net.karneim:pojobuilder:4.3.0 '
}
นี่คือตัวอย่างโค้ดของสคริปต์บิลด์ ANT ตัวอย่างบางส่วนที่รันตัวประมวลผลคำอธิบายประกอบ PojoBuilder ภายในงาน 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 >
คุณยังสามารถกำหนดค่า Eclipse เพื่อรันตัวประมวลผลคำอธิบายประกอบ PojoBuilder ในระหว่างรอบการ build มันจะถูกเรียกใช้เมื่อใดก็ตามที่คุณบันทึกไฟล์ที่มีแหล่งที่มาที่มีคำอธิบายประกอบด้วย @GeneratePojoBuilder
ทำสิ่งต่อไปนี้เพื่อเปิดใช้งาน PojoBuilder สำหรับโปรเจ็กต์ Eclipse ของคุณ:
pojobuilder-4.3.0-annotations.jar
ให้กับโปรเจ็กต์ classpath ของคุณpojobuiler-4.3.0-jar-with-dependencies.jar
หากคุณต้องการรวบรวมแหล่งที่มาของโปรเจ็กต์นี้ด้วยตัวเอง คุณสามารถใช้ Gradle (ดู build.gradle)