go to http://oracle.in.th

Monday, October 19, 2009

Annotation Part#3 (Final)

บทความสุดท้ายนี้ เราจะกล่าวถึง 3 ตัวที่เหลือ ก็คือ Default Value, Single Value Annotation, และ Marker Annotation ครับ

Default Value
บางครั้ง element ใน annotation เราสามารถกำหนดค่าเริ่มต้นให้กับ element ได้โดยใช้คำสงวนว่า default แล้วตามด้วยค่าที่ต้องการให้เป็นค่าเริ่มต้นของ element ดังตัวอย่างด้านล่าง
 () default "Default" ; 
เราลองไปดูในตัวอย่างใน file CTest.java โดยในนี้จะมีการประกาศ element ให้มีค่าเริ่มต้นไว้ทั้งหมด
@Retention(RetentionPolicy.RUNTIME)
@interface Author  {
String name() default "John Rambo" ;
String email() default "john@rambo.com";
}
จากนั้นลอง run ดูตามใน code ตัวอย่าง


Single Value Annotation
ในบางครั้งที่ annotation ของเรามี element แค่เพียง element เดียว ทำให้เราก็ไม่อยากจะมากำกับชื่อของ element ดัง เช่น @Author สังเกตได้ว่ามีเพียงแค่ element เดียวก็จริงแต่เวลาที่เราเรียกใช้นั้นเรายังต้องระบุชื่อในการกำหนด element
@Author( name = "John Rambo" )
แต่เราจะเรียกแบบไม่ระบุชื่อแบบตัวอย่างด้านล่างนี้ไม่ได้
@Author("John Rambo")
การที่เรามี element แค่เพียง element เดียว และเราต้องการที่จะไม่ต้องใส่ชื่อของ element ในตอนใช้ annotation เราต้องประกาศ element ที่มีชื่อว่า value
String value();
จากนั้นเราลองไปดูในตัวอย่างกัน
@Retention(RetentionPolicy.RUNTIME)
@interface Author {
String value();
}
จากนั้นเราลองเรียกใช้ดู
@Author("John Rambo")
class D { }

class DTest {
public static void main(String args[]) {
Author a = D.class.getAnnotation(Author.class);
System.out.println(a.value());
}
}
สังเกตเวลาเราเอาค่าออกมานั้นก็ยังใช้วิธีเหมือนเดิม

NOTE
ลองดูว่าเราสามารถประกาศ element value ปนกับ element อื่นได้ไหม ถ้าได้เราจะยังสามารถประกาศ Annotation แบบที่ไม่ต้องระบุชื่อ element ได้อีกไหม (คำตอบคือได้**แต่ต้องระบุค่า element อื่นให้มีค่าเป็น default ด้วย**)


Marker Annotation
เป็น annotation ที่ไม่มี element อะไรทั้งสิ้น โดยที่มีไว้เหมือนเป็นจุดมุ่งหมายเพื่อทำการ mark ยกตัวอย่างเช่น
// ETest.java   Marker
@Retention(RetentionPolicy.RUNTIME)
@interface John{ }

@Retention(RetentionPolicy.RUNTIME)
@interface Jack{ }

@John
class A {
@Jack
public void f() { }
}
ในตัวอย่างนี้มี @John และ @Jack ซึ่งเป็น annotation ที่ไว้ใช้ประกาศว่าใครเป็นผู้สร้าง source code อะไรซึ่งคล้ายกับ @Author เพียงแต่การต้องระบุ element name ลงไปเพื่อเป็นการแยกว่าเป็นใคร แต่ Mark Annotation นั้นใช้ annotation เป็นตัวแยกเลย ซึ่งวิธีการใช้ก็จะแตกต่างกันนิดหน่อย
class ETest {
public static void main(String args[]) throws Exception {
System.out.println(A.class.isAnnotationPresent(John.class));
System.out.println(A.class.isAnnotationPresent(Jack.class));

Method m = A.class.getMethod("f");
System.out.println(m.isAnnotationPresent(John.class));
System.out.println(m.isAnnotationPresent(Jack.class));
}
}
ของเดิมเราจะเอาค่าของ element ใน annotation มาใช้แต่ในของ Mark Annotation นั้นเราเอา annotation มาใช้เปรียบเทียบดังใน code ตัวอย่าง


Reference from : dr. Werasak Suengtaworn

Compose by : @plaumkamon
ข้อเขียนนี้ช่วยฉัน:  

No comments:

Post a Comment