Annotation Prepared by Viska Mutiawani 1 [email protected] Subtopik Annotation What is annotation? Kegunaan annotation. Cara membuat annotation. Cara menggunakan annotation type. 3 jenis annotation. Predefined annotation type. Meta-Annotation. Nested annotation. 2 [email protected] Intro Pada Java rilis 5.0, terjadi banyak penambahan pada bahasa Java. Salah satu penambahan tersebut adalah annotation. Annotation dalam bentuk yang paling sederhana: @Entity Simbol at (@) akan memberitahu compiler bahwa yang mengikuti setelah tanda tersebut adalah annotation. 3 [email protected] What is annotation? Annotation merupakan informasi data tentang kode program tetapi tidak akan berdampak secara langsung pada kode. Juga dikenal sebagai meta tag. 4 [email protected] Kegunaan Annotation Memberikan informasi kepada compiler. Annotation dapat digunakan oleh compiler untuk mendeteksi error atau supress warning. Compiler-time dan deployment-time processing 5 Software tools dapat memproses informasi dari annotation untuk menghasilkan code, file XML,dll Memudahkan perubahan [email protected] Kegunaan Annotation (2) Runtime processing Beberapa annotation akan diperiksa pada waktu runtime. Mengurangi waktu untuk me-maintain “side files” yang harus up-to-date seiring perubahan code pada file source. 6 [email protected] Bagaimana digunakannya? Annotation digunakan untuk mempengaruhi cara program diperlakukan oleh tool dan library. Annotation digunakan oleh tool untuk menghasilkan derived files. 7 Tools: compiler, IDE, runtime tools Derived files: Java code yang baru, deployment descriptor, file class [email protected] Cara membuat annotation Anggaplah ada coding pada grup pembangunan software seperti berikut: public class Generation3List extends Generation2List { // Author: John Doe // Date: 3/17/2002 // Current revision: 6 // Last modified: 4/12/2004 // By: Jane Doe // Reviewers: Alice, Bill, Cindy // class code goes here } 8 [email protected] Cara membuat annotation (2) Annotation type mirip seperti interface pada Java, namun ada beberapa hal khusus pada annotation yaitu: 9 Ada simbol @ yang mendahului katakunci interface Setiap method mendeklarasikan satu unsur pada annotation type Deklarasi method tidak boleh ada parameter juga katakunci throws Tipe data terbatas pada tipe primitif, String, Class, enums, annotations dan array dari tipe data sebelumnya Method boleh memiliki nilai default [email protected] Cara membuat annotation (3) Untuk mempermudah, komentar mengenai data pembuat dapat dibuat menjadi metadata dengan menggunakan annotation type. Contoh: @interface ClassPreamble { String author(); String date(); int currentRevision() default 1; String lastModified() default "N/A"; String lastModifiedBy() default "N/A"; // Note use of array String[] reviewers(); } 10 [email protected] Cara menggunakan annotation type Sesudah annotation type dibuat, anda dapat bebas menggunakannya sesuai keperluan seperti pada class, method, deklarasi variabel. Annotation merupakan modifier khusus yang dapat digunakan dimanapun sebagaimana modifier lainnya (ex: public, static, final) 11 Namun sebaiknya annotation mendahului modifier lain Annotation dimulai dari simbol @ diikuti oleh annotation type dan semua elemen di dalamnya dalam kurung ( ) [email protected] Cara menggunakan annotation type (2) Contoh: @ClassPreamble ( author = "John Doe", date = "3/17/2002", currentRevision = 6, lastModified = "4/12/2004", lastModifiedBy = "Jane Doe", // Note array notation reviewers = {"Alice", "Bob", "Cindy"} ) public class Generation3List extends Generation2List { // class code goes here } 12 [email protected] 3 jenis annotation Ada 3 jenis annotation: 13 Marker annotation Single value annotation Normal annotation [email protected] Marker annotation Merupakan annotation type tanpa elemen Annotation paling sederhana Deklarasi: /** * Indicates that the specification of the annotated * API element is preliminary and subject to change. */ public @interface Preliminary { } Cara pakai (tidak perlu kurung): @Preliminary public class TimeTravel { ... } 14 [email protected] Single value annotation Merupakan annotation type yang hanya memiliki satu elemen. Elemennya harus diberi nama “value” Deklarasi: /** * Associates a copyright notice with the annotated API element. */ public @interface Copyright { String value(); } Cara pakai (nama elemen dapat dihilangkan dan tidak perlu simbol =): @Copyright("2002 Yoyodyne Propulsion Systems") public class SomeClass { ... } 15 [email protected] Normal annotation Merupakan annotation dengan lebih dari 1 elemen. Deklarasi: public @interface RequestForEnhancement { int id(); String synopsis(); String engineer() default "[unassigned]"; String date(); default "[unimplemented]"; } Cara pakai: @RequestForEnhancement( id = 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody", date = "4/1/3007" ) public static void travelThroughTime(Date destination) { ... } 16 [email protected] Predefined Annotation Type Beberapa annotation yang digunakan oleh Java compiler (ada dalam java.lang): 17 @Deprecated @Override @SuppressWarnings @SafeVarargs @FunctionalInterface [email protected] @Deprecated Digunakan untuk menandai bahwa elemen yang ditandai sebaiknya tidak digunakan lagi. List pada Java api: http://docs.oracle.com/javase/7/docs/api/deprecated-list.html Contoh: // Javadoc comment follows /** * @deprecated * explanation of why it was deprecated */ @Deprecated static void deprecatedMethod() { } 18 [email protected] @Override Digunakan untuk menandai bahwa method yang ditandai merupakan method yang di-override (ditimpa) dari superclass atau interface. Jika tersilap, maka compiler memberi pesan error. Contoh: // mark method as a superclass // method that has been overridden @Override int overriddenMethod() { } 19 [email protected] @SupressWarnings Digunakan untuk tidak memunculkan pesan peringatan. Peringatan (warning) ada 2 jenis: deprecation dan unchecked. Warning dapat muncul pada penggunaan generics. Misal jika menggunakan method yang deprecated, maka annotation ini dipakai untuk menghilangkan pesan peringatan. Contoh: // use a deprecated method and tell // compiler not to generate a warning @SuppressWarnings("deprecation") void useDeprecatedMethod() { objectOne.deprecatedMethod(); //deprecation warning – suppressed } 20 [email protected] Meta-annotation Merupakan annotation yang digunakan oleh annotation lain. Beberapa yang ada dalam java.lang.annotation: 21 @Retention @Documented @Target @Inherited @Repeatable [email protected] @Retention Annotation @Retention menspesifikkan bagaimana annotation yang ditandakan disimpan. Ada 3 jenis policy: 22 RetentionPolicy.SOURCE - Annotation yang ditandakan hanya ditahan (retain) di dalam level source saja dan akan di-ignore oleh compiler. Jadi rentention ini hanya ada dalam source code dan tidak terekod di dalam file .class (file hasil kompilasi) RetentionPolicy.CLASS - Annotation yang ditandakan ditahan oleh compiler pada masa kompilasi, tapi akan di-ignore oleh Java Virtual Machine (JVM). Retention ini merupakan nilai default jika tidak dispesifikkan secara khusus. Retention ini akan masuk dalam file .class (file hasil kompilasi) tapi tidak digunakan oleh JVM. RetentionPolicy.RUNTIME - Annotation yang ditandakan ditahan oleh JVM jadi ia dapat digunakan semasa runtime. Retention ini ada dalam file .class (file hasil kompilasi) dan digunakan semasa runtime oleh JVM. [email protected] @Documented Secara default, annotation tidak akan didokumentasi oleh Javadoc. Namun jika kita menggunakan annotation @Documented, maka annotation yang kita buat akan terdokumentasi oleh Javadoc. Contoh: // import this to use @Documented import java.lang.annotation.*; @Documented @interface ClassPreamble { String author(); String date(); int currentRevision() default 1; String lastModified() default "N/A"; String lastModifiedBy() default "N/A"; // Note use of array String[] reviewers(); } 23 [email protected] @Target Annotation @Target memberi batasan annotation yang kita buat berlaku untuk elemen Java yang mana. Ada 8 jenis nilai untuk Target: 24 ElementType.ANNOTATION_TYPE - targetnya annotation type ElementType.CONSTRUCTOR - targetnya constructor ElementType.FIELD - targetnya field atau property ElementType.LOCAL_VARIABLE - targetnya local variable ElementType.METHOD - targetnya level method ElementType.PACKAGE - targetnya deklarasi package ElementType.PARAMETER - targetnya parameter pada method ElementType.TYPE - targetnya semua elemen pada class [email protected] Contoh penggunaan meta-annotation Deklarasi: @Target(ElementType.FIELD) @Retention(RetentionPolicy.CLASS) public @interface Accessor { String variableName(); String variableType() default "String"; } Cara pakai: @Accessor(variableName = "name") public String myVariable; 25 [email protected] Nested annotation Deklarasi: public @interface Reviewer { Name my_name(); //Name value(); } public @interface Name { String first(); String last(); } Cara pakai: @Reviewer(my_name = @Name(first = "James", last = "Gosling")) public class ComplexAnnotation { public static void main(String[] args) { // TODO code application logic here } } 26 [email protected]