Pada tahun 2005, dengan kedatangan Java 5, kami mengenal entitas baru yang disebut anotasi.

Anotasi adalah bentuk khusus dari metadata sintaksis yang dapat dideklarasikan dalam kode. Mereka digunakan untuk menganalisis kode saat kompilasi atau saat runtime. Anda dapat menganggap anotasi sebagai petunjuk label, tag, atau penyusun.

Anda mungkin pernah menemukan anotasi sebelumnya. Misalnya, saat mengganti metode kelas induk, kita menulis @Override sebelum metode itu sendiri. Anotasi ini menunjukkan bahwa metode induk akan ditimpa di kelas anak.

Sintaksis:


@Override
public int hashCode() {
      return super.hashCode();
}

Saya ingin segera mencatat bahwa anotasi tidak hanya berlaku untuk metode. Mereka digunakan dengan paket, kelas, metode, bidang, dan parameter.

Untuk memahami cara kerja anotasi, pertama-tama mari berkenalan dengan konsep antarmuka penanda. Sejak munculnya Java, pengembang selalu membutuhkan cara untuk menandai kelas untuk melakukan tindakan tertentu pada mereka.

Sebelum Java 5, mereka menggunakan antarmuka yang tidak melakukan apa yang kami harapkan dari antarmuka. Itu tidak memiliki metode dan tidak ada kontrak. Itu hanya menandai kelas sebagai spesial dalam beberapa hal.

Antarmuka seperti itu disebut antarmuka penanda. Dari namanya Anda mungkin menebak bahwa tujuannya adalah untuk menandai kelas untuk JVM, kompiler, atau beberapa pustaka. Beberapa antarmuka penanda, seperti Serializable , tetap ada. Antarmuka penanda ini memungkinkan kami menunjukkan bahwa instance kelas dapat diserialisasi.

Seperti yang telah kita lihat, antarmuka penanda terus hidup bahkan setelah pengenalan anotasi.

Anotasi versus antarmuka penanda:


@MyAnnotation
public class MyClass {}

public class MyClass implements MarkerInterface {}

Kedua pendekatan tersebut memiliki tujuan yang sama, namun terdapat perbedaan yang jelas dalam penerapannya. Misalnya, pertimbangkan antarmuka dan anotasi yang menunjukkan bahwa suatu kelas termasuk dalam tipe tertentu.

Jika kita menggunakan antarmuka, maka kita menandai kelasnya. Jika kita salah menggunakannya dan terjadi kesalahan, maka kita akan menemukan masalah saat kompilasi dan program tidak akan berjalan.

Dengan anotasi, semuanya tidak sesederhana itu: di sini kesalahan akan terdeteksi saat runtime, yang berarti program akan dimulai, tetapi, tidak mengherankan, tidak akan selesai.

Perhatikan bahwa jika kita perlu menandai kelas untuk penggunaan di masa mendatang, instance-nya harus diteruskan ke metode tertentu:


public class MyInteger implements Sum {}
interface Sum {};

public static void main(String[] args) throws IOException {
        increase(new MyInteger());
}
 
public static void increase(Sum count) {
        // TODO
}

Antarmuka penanda berfungsi paling baik di sini.

Sebaiknya gunakan anotasi saat kita membutuhkan sesuatu yang lebih, seperti parameter yang didukung anotasi.

Mari kita lihat anotasi standar di JDK:

Anotasi Keterangan Contoh
@Mengesampingkan Menentukan bahwa metode menimpa metode superclass atau mengimplementasikan metode kelas abstrak atau antarmuka.

@Override
public int hashCode() {
        return super.hashCode();
}
@Usang Menandai kode sebagai usang.

@Deprecated
public abstract void method();
@SuppressWarnings Menonaktifkan peringatan kompiler untuk elemen beranotasi. Perhatikan bahwa jika Anda perlu menonaktifkan beberapa kategori peringatan, mereka harus diapit oleh kurung kurawal, misalnya @SuppressWarnings({"unchecked", "cast"}) .

public class DocumentsFolder {
   private List documents;

   @SuppressWarnings("unchecked")
public void addDocument(String document) {
            documents.add(document);
   }
}

Dalam contoh ini, kami mencoba menambahkan ke daftar yang tidak memiliki tipe yang ditentukan (tipe generik). Kompiler akan memperingatkan kita tentang ini. Ini sangat berguna, tetapi terkadang ada terlalu banyak "peringatan" dan bisa berisik. Anda dapat menggunakan anotasi metode ini dan menentukan jenis peringatan kompiler sebagai argumen. Ada banyak penanda, jadi jangan khawatir untuk mengingat semuanya — IDEA biasanya akan memberi tahu Anda mana yang harus ditambahkan.

Contoh lain dengan banyak argumen:


@SuppressWarnings({"unchecked", "deprecated"})