Default Value
บางครั้ง element ใน annotation เราสามารถกำหนดค่าเริ่มต้นให้กับ element ได้โดยใช้คำสงวนว่า default แล้วตามด้วยค่าที่ต้องการให้เป็นค่าเริ่มต้นของ element ดังตัวอย่างด้านล่าง
เราลองไปดูในตัวอย่างใน file CTest.java โดยในนี้จะมีการประกาศ element ให้มีค่าเริ่มต้นไว้ทั้งหมด() default "Default" ;
@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 ที่มีชื่อว่า valueString 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 ด้วย**)
ลองดูว่าเราสามารถประกาศ 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