เพื่อเรียนรู้คำอธิบายประกอบในเชิงลึก เราต้องสามารถกำหนดคำอธิบายประกอบของเราเองและใช้งานได้ ก่อนที่จะกำหนดคำอธิบายประกอบของเราเอง เราต้องเข้าใจไวยากรณ์ของคำอธิบายประกอบเมตาและคำอธิบายประกอบคำจำกัดความที่เกี่ยวข้องที่จัดทำโดย Java
-------------------------------------------------- -------------------------------------------------- ----------------------------------
คำอธิบายประกอบเมตา:
บทบาทของคำอธิบายประกอบเมตาคือการใส่คำอธิบายประกอบอื่นๆ Java5.0 กำหนดประเภทคำอธิบายประกอบเมตามาตรฐานสี่ประเภท ซึ่งใช้เพื่อจัดเตรียมคำอธิบายของคำอธิบายประกอบประเภทอื่น คำอธิบายประกอบ Meta ที่กำหนดโดย Java5.0:
1.@เป้าหมาย
2.@การเก็บรักษา
3.@เอกสาร,
4.@สืบทอดมา
ประเภทเหล่านี้และคลาสที่สนับสนุนมีอยู่ในแพ็คเกจ java.lang.annotation มาดูบทบาทของคำอธิบายประกอบเมตาแต่ละรายการและคำแนะนำในการใช้พารามิเตอร์ย่อยที่เกี่ยวข้องกัน
-------------------------------------------------- -------------------------------------------------- ----------------------------------
@เป้า:
@Target อธิบายขอบเขตของออบเจ็กต์ที่แก้ไขโดยคำอธิบายประกอบ: คำอธิบายประกอบสามารถใช้สำหรับแพ็คเกจ ประเภท (คลาส อินเทอร์เฟซ การแจงนับ ประเภทคำอธิบายประกอบ) สมาชิกประเภท (เมธอด ตัวสร้าง ตัวแปรสมาชิก ค่าการแจงนับ) พารามิเตอร์วิธีการ และตัวแปรท้องถิ่น ( เช่น ตัวแปรลูป พารามิเตอร์ catch) การใช้เป้าหมายในการประกาศประเภทคำอธิบายประกอบสามารถทำให้เป้าหมายที่แก้ไขชัดเจนยิ่งขึ้น
ฟังก์ชัน: ใช้เพื่ออธิบายขอบเขตการใช้คำอธิบายประกอบ (เช่น: ตำแหน่งที่สามารถใช้คำอธิบายประกอบที่อธิบายไว้ได้)
ค่า (ElementType) คือ:
1.CONSTRUCTOR: ใช้เพื่ออธิบายตัวสร้าง 2.FIELD: ใช้เพื่ออธิบายโดเมน 3.LOCAL_VARIABLE: ใช้เพื่ออธิบายตัวแปรท้องถิ่น 4.วิธีการ: ใช้เพื่ออธิบายวิธีการ 5.PACKAGE: ใช้เพื่ออธิบายแพ็คเกจ 6.PARAMETER: ถูกใช้ เพื่ออธิบายพารามิเตอร์ 7.TYPE: ใช้เพื่ออธิบายคลาส อินเทอร์เฟซ (รวมถึงประเภทคำอธิบายประกอบ) หรือการประกาศแจงนับ
ตัวอย่างการใช้งาน:
@เป้าหมาย(ElementType.FIELD)
สาธารณะ @interface NoDBColumn {
-
-------------------------------------------------- -------------------------------------------------- ----------------------------------
@การเก็บรักษา:
@Retention กำหนดระยะเวลาที่คำอธิบายประกอบจะถูกเก็บรักษาไว้: คำอธิบายประกอบบางส่วนจะปรากฏในซอร์สโค้ดเท่านั้นและจะถูกละทิ้งโดยคอมไพเลอร์ ในขณะที่คำอธิบายประกอบอื่น ๆ ที่ถูกคอมไพล์ในไฟล์คลาสอาจถูกจำลองเสมือน เครื่องจะเพิกเฉยต่อสิ่งเหล่านั้น ในขณะที่คลาสอื่นๆ จะถูกอ่านเมื่อมีการโหลดคลาส (โปรดทราบว่าจะไม่ส่งผลกระทบต่อการดำเนินการของคลาส เนื่องจากคำอธิบายประกอบและคลาสถูกใช้แยกกัน) ใช้คำอธิบายประกอบเมตานี้เพื่อจำกัด "วงจรชีวิต" ของคำอธิบายประกอบ
ฟังก์ชัน: ระบุว่าข้อมูลคำอธิบายประกอบจำเป็นต้องได้รับการบันทึกในระดับใด และใช้เพื่ออธิบายวงจรชีวิตของคำอธิบายประกอบ (เช่น: ภายในขอบเขตที่คำอธิบายประกอบที่อธิบายนั้นถูกต้อง)
ค่า (RetentionPoicy) คือ:
1.SOURCE: ถูกต้องในไฟล์ต้นฉบับ (นั่นคือ ไฟล์ต้นฉบับจะยังคงอยู่)
2.CLASS: ใช้ได้เฉพาะในไฟล์คลาส (เช่น คลาสที่สงวนไว้)
3.RUNTIME: ใช้ได้ ณ รันไทม์ (นั่นคือ เก็บไว้ที่รันไทม์)
ประเภทคำอธิบายประกอบเมตาการเก็บรักษามีค่าเฉพาะในฐานะสมาชิก และค่านั้นมาจากค่าประเภทการแจงนับของ java.lang.annotation.RetentionPolicy ตัวอย่างเฉพาะมีดังนี้:
-------------------------------------------------- -------------------------------------------------- ----------------------------------
@จัดทำเป็นเอกสาร:
@Documented ใช้เพื่ออธิบายคำอธิบายประกอบประเภทอื่นๆ ที่ควรใช้เป็น API สาธารณะของสมาชิกโปรแกรมที่มีคำอธิบายประกอบ จึงสามารถจัดทำเอกสารได้ด้วยเครื่องมือ เช่น javadoc Documented เป็นคำอธิบายประกอบมาร์กอัปและไม่มีสมาชิก
@Inherited meta-annotation เป็นคำอธิบายประกอบแบบมาร์กอัป โดย @Inherited ระบุว่าประเภทคำอธิบายประกอบบางประเภทได้รับการสืบทอดมา หากใช้ประเภทคำอธิบายประกอบที่แก้ไขด้วย @Inherited สำหรับคลาส คำอธิบายประกอบนี้จะใช้สำหรับคลาสย่อยของคลาสนั้น
หมายเหตุ: ประเภทคำอธิบายประกอบ @Inherited ได้รับการสืบทอดโดยคลาสย่อยของคลาสที่มีคำอธิบายประกอบ คลาสไม่สืบทอดคำอธิบายประกอบจากอินเทอร์เฟซที่นำไปใช้ และวิธีการไม่สืบทอดคำอธิบายประกอบจากวิธีที่มันโอเวอร์โหลด
เมื่อการเก็บรักษาคำอธิบายประกอบที่มีคำอธิบายประกอบชนิด @Inherited คือ RetentionPolicy.RUNTIME API การสะท้อนจะปรับปรุงการสืบทอดนี้ หากเราใช้ java.lang.reflect เพื่อสืบค้นคำอธิบายประกอบของประเภทคำอธิบายประกอบ @Inherited การตรวจสอบรหัสสะท้อนแสงจะเริ่มทำงาน: ตรวจสอบคลาสและคลาสพาเรนต์จนกว่าจะพบประเภทคำอธิบายประกอบที่ระบุ หรือที่ระดับบนสุดของโครงสร้างการสืบทอดคลาส ถึงแล้ว
รหัสตัวอย่าง:
-------------------------------------------------- -------------------------------------------------- ----------------------------------
คำอธิบายประกอบที่กำหนดเอง:
เมื่อใช้ @interface เพื่อปรับแต่งคำอธิบายประกอบ อินเทอร์เฟซ java.lang.annotation.Annotation จะได้รับการสืบทอดโดยอัตโนมัติ และคอมไพเลอร์จะกรอกรายละเอียดอื่นๆ โดยอัตโนมัติ เมื่อกำหนดคำอธิบายประกอบ คุณไม่สามารถสืบทอดคำอธิบายประกอบหรืออินเทอร์เฟซอื่นๆ ได้ @interface ใช้ในการประกาศคำอธิบายประกอบ และแต่ละวิธีจะประกาศพารามิเตอร์การกำหนดค่าจริงๆ ชื่อของวิธีการคือชื่อของพารามิเตอร์ และประเภทค่าที่ส่งคืนคือประเภทของพารามิเตอร์ (ประเภทค่าที่ส่งคืนสามารถเป็นประเภทพื้นฐานได้เท่านั้น คลาส สตริง หรือแจงนับ) คุณสามารถประกาศค่าเริ่มต้นของพารามิเตอร์ผ่านค่าเริ่มต้นได้
กำหนดรูปแบบคำอธิบายประกอบ:
ชื่อคำอธิบายประกอบ @interface สาธารณะ {เนื้อหาคำจำกัดความ}
ประเภทข้อมูลที่รองรับของพารามิเตอร์คำอธิบายประกอบ:
1. ประเภทข้อมูลพื้นฐานทั้งหมด (int, float, boolean, byte, double, char, long, short)
2. ประเภทสตริง 3. ประเภทคลาส 4. ประเภท Enum 5. ประเภทคำอธิบายประกอบ 6. อาร์เรย์ของประเภทข้างต้นทั้งหมด
วิธีการตั้งค่าพารามิเตอร์ในประเภทคำอธิบายประกอบ:
ขั้นแรกสามารถแก้ไขได้ด้วยสิทธิ์การเข้าถึงสองแบบเท่านั้น เช่น ค่าสตริง ();
ประการที่สอง สมาชิกพารามิเตอร์สามารถใช้ประเภทข้อมูลพื้นฐานได้เพียงแปดประเภท ได้แก่ ไบต์, สั้น, ถ่าน, int, ยาว, ลอย, สองเท่า, บูลีน และประเภทข้อมูล เช่น สตริง, Enum, คลาส, คำอธิบายประกอบ และอาร์เรย์ประเภทเหล่านี้ ค่าสตริง();สมาชิกพารามิเตอร์ที่นี่คือสตริง;
ประการที่สาม หากมีสมาชิกพารามิเตอร์เพียงตัวเดียว วิธีที่ดีที่สุดคือตั้งชื่อพารามิเตอร์เป็น "value" ตามด้วยวงเล็บ ตัวอย่าง: คำอธิบายประกอบ FruitName ในตัวอย่างต่อไปนี้มีสมาชิกพารามิเตอร์เพียงตัวเดียว
คำอธิบายประกอบแบบกำหนดเองแบบง่ายๆ และตัวอย่างการใช้คำอธิบายประกอบ:
นำเข้า java.lang.annotation.Documented;
นำเข้า java.lang.annotation.ElementType;
นำเข้า java.lang.annotation.Retention;
นำเข้า java.lang.annotation.RetentionPolicy;
นำเข้า java.lang.annotation.Target;
-
* หมายเหตุเกี่ยวกับชื่อผลไม้
* @ผู้เขียน เปย์ดา
-
-
@เป้าหมาย(ElementType.FIELD)
@การเก็บรักษา (RetentionPolicy.RUNTIME)
@จัดทำเป็นเอกสาร
สาธารณะ @interface FruitName {
ค่าสตริง() ค่าเริ่มต้น "";
-
นำเข้า java.lang.annotation.Documented;
นำเข้า java.lang.annotation.ElementType;
นำเข้า java.lang.annotation.Retention;
นำเข้า java.lang.annotation.RetentionPolicy;
นำเข้า java.lang.annotation.Target;
-
* คำอธิบายประกอบสีผลไม้
* @ผู้เขียน เปย์ดา
-
-
@เป้าหมาย(ElementType.FIELD)
@การเก็บรักษา (RetentionPolicy.RUNTIME)
@จัดทำเป็นเอกสาร
สาธารณะ @interface FruitColor {
-
* การแจงนับสี
* @ผู้เขียน เปย์ดา
-
-
สี enum สาธารณะ {BULE, RED, GREEN};
-
* คุณสมบัติสี
* @กลับ
-
สี FruitColor() ค่าเริ่มต้น Color.GREEN;
-
นำเข้าคำอธิบายประกอบ FruitColor.Color;
คลาสสาธารณะ Apple {
@FruitName("แอปเปิ้ล")
สตริงส่วนตัว appleName;
@FruitColor(fruitColor=Color.RED)
appleColor สตริงส่วนตัว;
โมฆะสาธารณะ setAppleColor (String appleColor) {
this.appleColor = appleColor;
-
สตริงสาธารณะ getAppleColor() {
กลับ appleColor;
-
โมฆะสาธารณะ setAppleName (String appleName) {
this.appleName = แอปเปิ้ลชื่อ;
-
สตริงสาธารณะ getAppleName() {
กลับ appleName;
-
โมฆะสาธารณะ displayName(){
System.out.println("ชื่อของผลไม้คือ: Apple");
-
-