Manfaat utama anotasi tidak berasal dari penggunaan anotasi standar yang sudah ada di JDK. Pada saat yang sama, jarang ada kebutuhan untuk membuat anotasi Anda sendiri. Namun jika kita mengembangkan sistem besar atau membuat perpustakaan terpisah, maka pada tingkat arsitektur, menerapkan anotasi kita sendiri pasti akan menghasilkan keuntungan.

Mari kita coba membuat anotasi.

Untuk melakukan ini, buat file, tetapi alih-alih menulis class atau interface , tulis @interface . Ini akan menjadi file untuk anotasi kita. Struktur internal anotasi mirip dengan antarmuka.

public @interface Sum {
   int sum() default 0;
}

@interface menunjukkan bahwa ini adalah anotasi,
default mengatakan bahwa parameter akan memiliki nilai default tertentu.

Ta-da! Kami membuat anotasi! Secara teoritis kita sudah dapat menggunakannya, tetapi pertama-tama akan lebih baik untuk mengkonfigurasinya.

Tanpa konfigurasi, anotasi kita dapat diterapkan ke apa pun (ke kelas, metode, atribut, dll.), jadi tidak masuk akal untuk menggunakannya pada saat ini. Anehnya, anotasi kita perlu dianotasi dengan anotasi lain!

Mari kita mulai dengan @Target .

Anotasi @Target (relevan sejak Java 1.5) membatasi kemampuan untuk menerapkan anotasi. Untuk membatasi penggunaan ke tingkat tertentu, kita perlu meneruskan argumen ke anotasi @Target untuk menunjukkan jenis yang dapat diterapkan. Berikut adalah beberapa jenis yang umum digunakan:

@Target(JenisElemen.PAKET) untuk paket
@Target(ElemenType.TYPE) untuk kelas
@Target(ElementType.CONSTRUCTOR) untuk konstruktor
@Target(ElemenType.METHOD) untuk metode
@Target(ElemenType.FIELD) untuk atribut (variabel) di kelas
@Target(ElemenType.PARAMATER) untuk parameter metode
@Target(ElemenType.LOCAL_VARIABLE) untuk variabel lokal

Jika Anda memerlukan anotasi untuk beberapa jenis, maka Anda dapat memberikan beberapa argumen sebagai larik:

@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })

Bagian penting berikutnya dari konfigurasi adalah anotasi @Retention .

Anotasi ini menunjukkan bagian dari siklus hidup kode di mana anotasi kita akan tersedia:

RetentionPolicy.SOURCE Anotasi yang ditandai dengan kebijakan retensi SOURCE akan dibuang pada waktu proses.
RetentionPolicy.CLASS Anotasi yang ditandai dengan kebijakan penyimpanan CLASS ditulis ke file .class , tetapi dihapus saat dijalankan.
RetentionPolicy.RUNTIME Anotasi yang ditandai dengan kebijakan retensi RUNTIME tetap ada saat dijalankan dan dapat diakses di program kami saat dijalankan.

Ada beberapa anotasi lagi yang dapat Anda gunakan untuk konfigurasi:

Anotasi Nilai
@Diwariskan Menunjukkan bahwa kelas turunan mewarisi penerapan anotasi kelas induk.
@Didokumentasikan Ini menunjukkan bahwa anotasi akan disertakan dalam dokumentasi Javadoc yang dihasilkan.

Sekarang mari kita coba membuat anotasi kita sendiri.

Kami akan membuat anotasi untuk kelas dan metode dan berisi informasi tentang penulis dan versi kode:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

Kami dapat menerapkan anotasi kami ke metode dan kelas. Metadata anotasi kami akan tersedia pada waktu proses. Perhatikan parameter anotasi kami: Kami dapat menyediakan dua argumen (penulis dan versi), atau kami dapat menghilangkannya. Jika kita menghilangkannya, maka nilai default yang ditentukan ( default "Author" dan default "0.0" ) akan digunakan.

Perlu dicatat bahwa kita tidak perlu menentukan nilai default untuk parameter. Dalam hal ini, parameter menjadi wajib.

Saat memberikan argumen, kita harus menentukan parameter yang sesuai menggunakan notasi value = "value" . Parameter harus selalu diberi nama secara eksplisit, meskipun anotasi memiliki parameter tunggal.

Mari terapkan anotasi kita ke beberapa kelas:

@Info
public class MyClass1 {
   @Info
   public void myClassMethod() {}
}

@Info(version = "2.0")
public class MyClass2 {
   @Info(author = "Anonymous")
   public void myClassMethod() {}
}

@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
   @Info(author = "Anonymous", version = "4.0")
   public void myClassMethod() {}
}