Type Annotations และ Repeating Annotations ใน Java

19-ก.ค.-19

คัมภีร์เทพ IT

สำหรับคนที่ใช้งานภาษา Java คงจะทราบกันดีอยู่แล้วว่า สามารถใช้งาน Annotation ได้ โดยมันเป็น  Meta Data ที่สามารถใส่เข้าไปใช้งานกับ Class, Method, Property, Statement และ Parameter ได้ โดยไม่ต้องไปแก้ไขหรือปรับเปลี่ยนอะไรที่ Code เดิม โดยบทความนี้ จะกล่าวถึง Type Annotations และ Repeating Annotations ใน Java

Type Annotations

ก่อนที่ Java SE 8 จะถูก Release ออกมา Annotations สามารถถูกนำไปใช้กับการ Declarations เท่านั้น แต่หลังจากที่ Java SE 8 ถูก Release ออกมาแล้ว Annotations สามารถถูกนำไปใช้กับ Type ต่าง ๆ ได้ นั่นหมายความว่า Annotations สามารถถูกนำไปใช้ได้ทุกที่ที่คุณใช้ Type สำหรับตัวอย่างบางส่วนที่มีการใช้ Type ก็คือ class instance creation expressions (new), casts, implements clauses และ throws clauses

  • Class instance creation expression:

  • Type cast:

  • implements clause:

  • Thrown exception declaration:

รูปแบบของ Annotation เหล่านี้ ถูกเรียกว่า Type Annotation

Type Annotations ถูกสร้างขึ้นเพื่อรองรับการวิเคราะห์ให้ดีขึ้นของ Java Programs เพื่อให้แน่ใจในเรื่อง Type Checking ที่ดีขึ้น แม้ใน Java SE 8 จะไม่ได้จัดเตรียม Type Checking Framework เอาไว้ให้ แต่ก็อนุญาตให้คุณสามารถเขียน (หรือ Download) Type Checking Framework ที่จะนำไปใช้เป็น Modules ซึ่งสามารถนำไปใช้ร่วมกับ Java Compiler ได้

อย่างเช่น คุณต้องการแน่ใจว่า ตัวแปรใน Program ของคุณจะไม่ถูก Assign เป็น Null และคุณก็ต้องการหลีกเลี่ยงการเรียกใช้ NullPointerException ดังนั้น คุณสามารถเขียน Plug-in แบบ Custom ได้ เพื่อตรวจสอบสิ่งนี้ จากนั้นคุณก็แก้ไข Code ของคุณเพื่อเพิ่มคำอธิบายเพิ่มเติมของตัวแปรนั้น โดยระบุว่า มันจะไม่ถูก Assign เป็น Null ซึ่งการประกาศตัวแปร จะเป็นดังนี้:

เมื่อคุณทำการ Compile Code ของคุณ (รวมทั้ง NonNull Module ที่ Command Line) Compiler จะแสดงคำเตือน (Warning) ออกมา เมื่อมันตรวจพบว่าอาจมีปัญหาเกิดขึ้น ทำให้คุณสามารถแก้ไข Code ให้ถูกต้องเพื่อหลีกเลี่ยง Error ต่าง ๆ และหลังจากที่คุณแก้ไข Code และไม่มีเกิด Warning ขึ้นแล้ว เมื่อ Program ถูก Run คุณก็จะไม่พบพวก Error ต่าง ๆ ใน Program ของคุณ

คุณสามารถใช้ Type-Checking Module ได้หลาย ๆ Module โดยที่แต่ละ Module จะถูกใช้ในการตรวจสอบประเภทของ Error ที่แตกต่างกันไป ด้วยวิธีนี้คุณจะสามารถสร้างการตรวจสอบเพิ่มเติมจาก Java Type System ได้ โดยเพิ่มการตรวจสอบเข้าไปไม่ว่าจะตรงไหนหรือเมื่อใดก็ได้ตามแต่คุณจะต้องการ

ด้วยการใช้ Type Annotations อย่างชาญฉลาดรวมทั้งมี Type Checker (ตัวตรวจสอบ Type) พ่วงอยู่ด้วย คุณจะสามารถเขียน Code ที่แข็งแกร่งยิ่งขึ้น และมีแนวโน้มที่จะเกิด Error น้อยลง

ในหลายกรณี คุณอาจไม่จำเป็นต้องเขียน Type Checking Modules เองก็ได้ เนื่องจากมี Third Parties ที่จะช่วยทำในเรื่องนี้ให้คุณอยู่แล้ว ตัวอย่างเช่น คุณอาจต้องการใช้ประโยชน์จาก Checker Framework ที่สร้างโดย University of Washington ซึ่ง Framework นี้รวมไปถึง NonNull Module, Regular Expression Module และ Mutex Lock Module คุณสามารถดูข้อมูลเพิ่มเติมเกี่ยวกับ Checker Framework ได้ที่นี่

Repeating Annotations

อาจมีบางสถานการณ์ ที่คุณต้องการใช้ Annotation เดิมซ้ำ ๆ ในการ Declaration หรือ Type Use ซึ่งตั้งแต่ Java SE 8 เป็นต้นมา คุณสามารถใช้ Repeating Annotations เพื่อช่วยทำในสิ่งนี้ได้

อย่างเช่น คุณกำลังเขียน Code สำหรับใช้ Timer Service ที่จะทำให้คุณสามารถเรียกใช้ Method ในช่วงเวลาใดเวลาหนึ่งหรือตาม Schedule ที่วางไว้ ซึ่งมันก็คล้ายกับ UNIX cron service ตอนนี้คุณต้องตั้งเวลาโดยให้เรียกใช้งาน doPeriodicCleanup Method ในวันสุดท้ายของเดือน และทุกวันศุกร์เวลา 23.00 น. หากต้องการตั้งค่าตัวจับเวลาเพื่อให้มัน Run ก็ให้คุณสร้าง @Schedule Annotation และใช้มัน 2 ครั้งกับ doPeriodicCleanup Method โดยที่ การใช้งานในครั้งแรก ให้ระบุเป็นวันสุดท้ายของเดือน และการใช้ในครั้งที่ 2 ให้ระบุเป็นวันศุกร์เวลา 23.00 น. ตามที่แสดงในตัวอย่าง Code ด้านล่างนี้:

จากตัวอย่างด้านบน เป็นการใช้ Annotation กับ Method โดยคุณสามารถใช้ Annotation ซ้ำได้ทุกที่ที่คุณต้องการจะใช้ Standard Annotation อย่างเช่น คุณมี Class สำหรับจัดการกับ Unauthorized Access Exceptions คุณสามารถใส่คำอธิบายเพิ่มเติมใน Class ด้วย @Alert เข้าไป โดยที่ 1 รายการสำหรับ Managers และอีก 1 รายการสำหรับ Admins:

ด้วยเหตุผลในเรื่องความเข้ากันได้ (Compatibility), Repeating Annotations จะถูกเก็บไว้ใน Container Annotation ที่ถูกสร้างขึ้นอัตโนมัติโดย Java Compiler และเพื่อให้ Compiler ทำในสิ่งนั้น เราจำเป็นต้องมีการ Declare 2 รายการใน Code คือ

Step 1: Declare “Repeatable Annotation Type”

Annotation Type จะต้องถูกระบุด้วย @Repeatable Meta-Annotation อย่างในตัวอย่างต่อไปนี้ จะเป็นการกำหนด @Schedule Repeatable Annotation Type แบบ Custom ได้:

ค่าของ @Repeatable Meta-Annotation ที่อยู่ในวงเล็บ คือ Type ของ Container Annotation ที่ Java Compiler สร้างขึ้นเพื่อเก็บ Repeating Annotations ในตัวอย่างนี้ Containing Annotation Type คือ Schedules ดังนั้น Repeating @Schedule Annotations จะถูกเก็บไว้ใน @Schedules Annotation

การใส่ Annotation ชนิดเดียวกัน ไปยังจุดเดียวกันมากกว่า 1 อัน โดยที่ไม่ได้ประกาศ Annotation นั้นเป็น Repeatable ก่อนจะทำให้เกิด Compile-Time Error ขึ้น

Step 2: Declare “Containing Annotation Type”

Containing Annotation Type จะต้องมี Value Element กับ Array Type ส่วน Component Type ของ Array Type จะต้องเป็น Repeatable Annotation Type การ Declare สำหรับ Schedules Containing Annotation Type จะเป็นดังด้านล่างนี้:

Retrieving Annotations

มีหลาย Method ใน Reflection API ที่สามารถใช้เพื่อ Retrieve Annotations ได้ ลักษณะการทำงานของ Method ที่ทำการ Return Single Annotation  ( เช่น AnnotatedElement.getAnnotation(Class<T>) ) จะไม่มีการเปลี่ยนแปลงโดยที่พวกมันจะ Return Single Annotation เมื่อมี 1 Annotation ของ Requested Type เกิดขึ้น แต่หากมีมากกว่า 1 Annotation ของ Requested Type คุณจะได้รับจาก Container Annotation ของพวกมันก่อน ด้วยวิธีนี้ ทำให้ Code ดั้งเดิมยังคงสามารถทำงานต่อไปได้ สำหรับ Method อื่น ๆ ที่มีใน Java SE 8 ที่คุณสามารถตรวจดูผ่าน Container Annotation เพื่อ Return Annotations หลายรายการพร้อม ๆ กันในคราวเดียวได้ เช่น AnnotatedElement.getAnnotationsByType(Class <T>) โดยคุณสามารถดูรายละเอียดเพิ่มเติมเกี่ยวกับ AnnotatedElement Class Specification ได้ที่นี่

ข้อที่ควรพิจารณาในการ Design

เมื่อต้องออกแบบ Annotation Type คุณต้องพิจารณาถึงจำนวนครั้งของการใช้ซ้ำของ Annotations นั้นที่จุดเดียวกันด้วย มันเป็นไปได้ที่จะไม่ใช้ Annotation เลย, ใช้เพียงแค่ครั้งเดียว หรือมากกว่าหนึ่งครั้ง นอกจากนี้ยังสามารถใช้ @Target Meta-Annotation เพื่อจำกัดในสิ่งที่ Annotation Type นั้นจะถูกใช้ได้ อย่างเช่น คุณสามารถสร้าง Repeatable Annotation Type ซึ่งสามารถใช้ได้กับ Methods และ Fields เท่านั้น มันเป็นเรื่องสำคัญในการออกแบบ Annotation Type ด้วยความระมัดระวัง เพื่อให้แน่ใจว่า Programmer ที่จะใช้ Annotation เหล่านั้น จะสามารถใช้มันได้อย่างยืดหยุ่น และมีประสิทธิภาพมากที่สุดเท่าที่จะเป็นไปได้

ที่มา:  https://medium.com/

 

 

รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความล่าสุด