ร้อยเรียงโค้ดเป็นบทกวีด้วย JavaPoet
ปัญหาอย่างหนึ่งที่ผมเจอเวลาสร้าง project ใหม่แต่ละครั้ง คือการที่ต้องการสร้าง code ซ้ำๆเดิมๆ บางทีก็ลืมหรือขี้เกียจจนทำให้ code ผิดรูปแบบไป มันคงดีไม่น้อยถ้าเรามีตัวช่วยสร้าง code แบบที่เราต้องการ
จากการค้นหาอย่างหนักหน่วงก็เจอ library น่าสนใจนามว่าJavaPoet ซึ่งเจ้าตัวนี้จะช่วยเราสร้าง Java code ให้เราอย่างง่ายดายและสวยงาม
ร่ายกวี
ในตัวอย่างนี้ผมจะสร้าง MVP template ขึ้นมาโดยจะมีโครงสร้างง่ายๆประกอบไปด้วย Activity, View, Presenter
ขั้นแรกสร้าง module Java Library ขึ้นมาก่อน เนื่องจากตัว javax.lang.model.element.Modifier ไม่มีอยู่ใน Android
จากนั้นเพิ่ม dependency ตัวนี้เข้าไป
compile 'com.squareup:javapoet:1.8.0'
พอ sync เสร็จแล้วก็มา add library อีกตัวคือ android.jar เนื่องจากว่าผมมีการเรียกใช้ Activity ด้วย เลยจำเป็นต้องเอา library มาใช้
ตัว android.jar สามารถหาได้จาก Android SDK ในเครื่อง
View
จาก code ด้านบน จะมีสองส่วนคือ ส่วนการสร้าง interface และการสร้าง file
TypeSpec มีไว้เพื่อใช้ในการสร้าง class/interface/enum อย่างใน code ข้างต้นจะมีการเรียก interfaceBuilder เพื่อสร้าง interface ด้วยชื่อที่เราต้องการ ในที่นี้ผมจะให้มีการส่งชื่อ feature ที่จะสร้างตามด้วยคำว่า View
ส่วนต่อมาคือ JavaFile จะรับ parameter สองตัว ตัวแรกคือชื่อ package ที่จะวาง interface นี้ และตัว TypeSpec ที่สร้างไว้ พอกำหนดเรียบร้อยแล้วก็ให้มันสร้างไฟล์ด้วย writeTo ได้เลย
ส่วนของ path ในการวางไฟล์ เนื่องจากว่าตัว module นี้อยู่ใน project ที่ผมจะใช้ ผมเลยกำหนดไปที่ module app เลย
interface ที่ได้จะเป็นเช่นนี้
Presenter
ในส่วนของ presenter จะมีการสร้าง field ชื่อ mView ด้วยคำสั่ง addField ซึ่งประกอบไปด้วย parameter สามส่วนคือ
- TypeName หรือ Type ใช้เพื่อกำหนด type เนื่องจากผมอ้างอิงถึง View ด้วย type ที่สร้างจาก TypeSpec เลยต้องใช้ ClassName ช่วยแบบนี้
- ชื่อ field ที่เราต้องการ
- Modifiers สามารถกำหนดได้มากกว่าหนึ่ง
นอกจาก field แล้ว presenter ตัวนี้มีการสร้าง method ที่ชื่อว่า attachView ไว้ด้วย โดย method สามารถสร้างด้วย MethodSpec ได้ จาก code ผมให้รับ view เข้ามาแล้วทำการ assign ให้ mView ที่สร้างก่อนหน้านี้
เมื่อ generate แล้วจะได้ presenter หน้าตาแบบนี้มา
Activity
ถึงส่วนสุดท้าย ในส่วนของ Activity มีสิ่งที่เพิ่มเข้ามาคือการเพิ่ม Annotation ให้ method onCreate รวมถึงการสร้าง comment TODO ให้ implement setContentView ทีหลัง
การเพิ่ม Annotation ทำได้ด้วยการใช้ addAnnotation แล้วกำหนด class ที่ต้องการได้เลย
อีกจุดนึงที่เข้ามาคือการใช้ $T ตอนเพิ่ม statement ข้อดีของการใช้ $T คือการที่ตัว JavaPoet จะช่วย import class ที่เกี่ยวข้องมาให้
ผลที่ได้จะเป็นเช่นนี้
Generate Code
เตรียมทุกอย่างเสร็จแล้ว ก็ถึงเวลาสร้าง code กัน
หลังจากที่รัน main แล้วก็จะได้ Java code มาสามไฟล์เก็บไว้ใน package ที่กำหนดไว้อย่างสวยงาม
จบตัวอย่างคร่าวๆการใช้งาน JavaPoet ขอให้ทุกท่านสนุกกับการ generate ครับ
เสริมด้วยวีดีโอจาก DroidCon
……….
น่าจะมี KotlinPoet เนอะ