Keuntungan utama saka anotasi ora teka saka nggunakake standar sing wis ana ing JDK. Ing wektu sing padha, arang banget perlu nggawe anotasi dhewe. Nanging yen kita ngembangake sistem gedhe utawa nggawe perpustakaan sing kapisah, mula ing tingkat arsitektur, ngleksanakake anotasi dhewe mesthi bakal ngasilake dividen.

Ayo nyoba nggawe anotasi.

Kanggo nindakake iki, nggawe file, nanging tinimbang nulis kelas utawa antarmuka , nulis @interface . Iki bakal dadi file kanggo anotasi kita. Struktur internal anotasi padha karo antarmuka.

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

@interface nuduhake yen iki minangka anotasi,
standar ujar manawa parameter kasebut bakal duwe nilai standar tartamtu.

Ta-da! Kita nggawe anotasi! Secara teoritis, kita wis bisa nggunakake, nanging luwih apik kanggo ngatur.

Tanpa konfigurasi, anotasi kita bisa ditrapake kanggo apa wae (kanggo kelas, metode, atribut, lan sapiturute), saengga ora ana gunane kanggo nggunakake ing titik iki. Aneh, anotasi kita kudu dianotasi karo anotasi liyane!

Ayo miwiti karo @Target .

Anotasi @Target (relevan wiwit Java 1.5) mbatesi kemampuan kanggo ngetrapake anotasi. Kanggo mbatesi panggunaan ing level tartamtu, kita kudu menehi argumen menyang anotasi @Target kanggo nuduhake jinis sing bisa ditrapake. Ing ngisor iki sawetara jinis sing umum digunakake:

@Target(ElementType.PACKAGE) kanggo paket
@Target(ElementType.TYPE) kanggo kelas
@Target(ElementType.KONSTRUKTOR) kanggo konstruktor
@Target(ElementType.METHOD) kanggo cara
@Target(ElementType.FIELD) kanggo atribut (variabel) ing kelas
@Target(ElementType.PARAMATER) kanggo paramèter metode
@Target(ElementType.LOCAL_VARIABLE) kanggo variabel lokal

Yen sampeyan butuh anotasi kanggo sawetara jinis, sampeyan bisa ngirim sawetara argumen minangka array:

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

Bagean penting konfigurasi sabanjure yaiku anotasi @Retention .

Anotasi iki nuduhake bagean saka siklus urip kode ing ngendi anotasi kita bakal kasedhiya:

RetentionPolicy.SUMBER Anotasi sing ditandhani karo kabijakan retensi SOURCE dibuwang nalika mbukak.
Kabijakan Penylametan.KELAS Anotasi sing ditandhani karo kabijakan penylametan CLASS ditulis menyang file .class , nanging dibusak nalika mbukak.
RetentionPolicy.RUNTIME Anotasi sing ditandhani karo kabijakan retensi RUNTIME tetep ana ing wektu mbukak lan bisa diakses ing program nalika wektu mbukak.

Ana sawetara anotasi liyane sing bisa digunakake kanggo konfigurasi:

Anotasi Nilai
@warisan Nuduhake yen kelas turunan marisi implementasine kelas induk saka anotasi.
@Dokumentasi Iki nuduhake yen anotasi bakal kalebu ing dokumentasi Javadoc sing digawe.

Saiki ayo nyoba nggawe anotasi dhewe.

Kita bakal nggawe anotasi kanggo kelas lan metode lan ngemot informasi babagan penulis lan versi kode:

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

Kita bisa ngetrapake anotasi kanggo metode lan kelas. Metadata anotasi kita bakal kasedhiya nalika mbukak. Priksa paramèter anotasi kita: Kita bisa nyedhiyakake rong argumen (penulis lan versi), utawa bisa ngilangi. Yen kita ngilangi, banjur nilai standar sing ditemtokake ( standar "Panulis" lan standar "0.0" ) bakal digunakake.

Wigati dicathet yen kita ora kudu nemtokake nilai standar kanggo paramèter. Ing kasus iki, parameter dadi wajib.

Nalika ngliwati argumen, kita kudu nemtokake parameter sing cocog nggunakake nilai notasi = "nilai" . Parameter kasebut kudu dijenengi kanthi jelas, sanajan anotasi kasebut nduweni parameter siji.

Ayo aplikasi anotasi kita menyang sawetara 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() {}
}