Annotation
Subtopik Annotation
What is annotation?
Kegunaan annotation.
Cara membuat annotation.
Cara menggunakan annotation type.
3 jenis annotation.
Predefined annotation type.
Meta-Annotation.
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
What is annotation?
Annotation merupakan informasi data tentang kode
program tetapi tidak akan berdampak secara
langsung pada kode.
Kegunaan Annotation
Memberikan informasi kepada compiler.
Annotation dapat digunakan oleh compiler untuk
mendeteksi error atau supress warning.
Compiler-time dan deployment-time processing
Software tools dapat memproses informasi dari
annotation untuk menghasilkan code, file XML,dll
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.
Bagaimana digunakannya?
Annotation digunakan untuk mempengaruhi cara
program diperlakukan oleh tool dan library.
Annotation digunakan oleh tool untuk menghasilkan
derived files.
Tools: compiler, IDE, runtime tools
Derived files: Java code yang baru, deployment
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 }
Cara membuat annotation (2)
Annotation type mirip seperti interface pada Java,
namun ada beberapa hal khusus pada annotation
yaitu:
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
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(); }
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)
Namun sebaiknya annotation mendahului modifier lain
Annotation dimulai dari simbol @ diikuti oleh annotation
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 }
3 jenis annotation
Ada 3 jenis annotation:
Marker annotation
Single value annotation
Normal annotation
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):
@PreliminarySingle 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 { ... }
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) { ... }
Predefined Annotation Type
Beberapa annotation yang digunakan oleh Java
compiler (ada dalam java.lang):
@Deprecated
@Override
@SuppressWarnings
@SafeVarargs
@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
@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
@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 }
Meta-annotation
Merupakan annotation yang digunakan oleh
annotation lain.
Beberapa yang ada dalam java.lang.annotation:
@Retention
@Documented
@Target
@Inherited
@Repeatable
@Retention
Annotation @Retention menspesifikkan bagaimana annotation
yang ditandakan disimpan.
Ada 3 jenis policy:
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.
@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
@Target
Annotation @Target memberi batasan annotation yang
kita buat berlaku untuk elemen Java yang mana.
Ada 8 jenis nilai untuk Target:
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
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;
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
} }