ร้อยเรียงโค้ดเป็นบทกวีด้วย JavaPoet

Christopher Hay-Yin Ng
2 min readJan 5, 2017

--

ปัญหาอย่างหนึ่งที่ผมเจอเวลาสร้าง 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 เนอะ

--

--