Jenis Anotasi Java: Panduan Lengkap tentang Anotasi Terdefinisi, Kustom, dan Meta
Jenis Anotasi Java
Tutorial ini mencakup anotasi Java—terdefinisi, kustom, dan meta-anotasi—dengan contoh yang jelas.
Anotasi Java adalah metadata yang menjelaskan elemen dalam kode sumber Anda. Platform Java SE menyediakan serangkaian anotasi standar, dan pengembang dapat membuat anotasi kustom yang disesuaikan dengan proyek mereka. Anotasi juga dapat diannotasi sendiri, membentuk yang dikenal sebagai meta-anotasi.
Anotasi terbagi menjadi tiga kategori:
- Predefined annotations – bawaan platform Java.
- Custom annotations – ditentukan pengguna untuk kebutuhan spesifik.
- Meta-annotations – anotasi yang diterapkan pada anotasi lain.
Jenis Anotasi Terdefinisi Sebelumnya
1. @Deprecated
Anotasi @Deprecated menandai bahwa sebuah kelas, metode, field, atau elemen lain sudah usang dan memiliki alternatif yang lebih baru. Kompiler akan mengeluarkan peringatan setiap kali elemen yang usang digunakan.
Sintaks:
@Deprecated public void oldMethod() { ... }
Javadoc menyediakan tag @deprecated untuk dokumentasi:
/** * @deprecated * Use {@link #newMethod()} instead. */ @Deprecated public void oldMethod() { ... }
Contoh
class Main { /** * @deprecated * Metode ini usang dan telah digantikan oleh newMethod() */ @Deprecated public static void deprecatedMethod() { System.out.println("Metode usang"); } public static void main(String[] args) { deprecatedMethod(); } }
Output
Metode usang
2. @Override
Anotasi @Override menunjukkan bahwa sebuah metode dimaksudkan untuk meng-override metode dari superclass atau antarmuka. Meskipun tidak wajib, ia menangkap kesalahan seperti tanda tangan yang tidak cocok pada waktu kompilasi.
Contoh
class Animal { public void display() { System.out.println("Saya adalah seekor hewan"); } } class Dog extends Animal { @Override public void display() { System.out.println("Saya adalah seekor anjing"); } public void printMessage() { display(); } } class Main { public static void main(String[] args) { Dog dog1 = new Dog(); dog1.printMessage(); } }
Output
Saya adalah seekor anjing
3. @SuppressWarnings
Anotasi ini menginstruksikan kompiler untuk mengabaikan kategori peringatan tertentu. Kategori umum meliputi deprecation dan unchecked.
Penggunaan:
@SuppressWarnings("deprecation")
Beberapa kategori:
@SuppressWarnings({"deprecation", "unchecked"})
Contoh
class Main { @Deprecated public static void deprecatedMethod() { System.out.println("Metode usang"); } @SuppressWarnings("deprecation") public static void main(String[] args) { Main depObj = new Main(); depObj.deprecatedMethod(); } }
Output
Metode usang
4. @SafeVarargs
Diterapkan pada metode final, static, atau private dan konstruktor, @SafeVarargs menyatakan bahwa metode tidak melakukan operasi yang tidak aman pada parameter varargsnya. Ini menghapus peringatan unchecked terkait varargs.
Contoh
import java.util.*; class Main { @SafeVarargs private static void displayList(List<String>... lists) { for (List<String> list : lists) { System.out.println(list); } } public static void main(String[] args) { List<String> universityList = Arrays.asList("Tribhuvan University", "Kathmandu University"); List<String> programmingLanguages = Arrays.asList("Java", "C"); displayList(universityList, programmingLanguages); } }
Output
[Tribhuvan University, Kathmandu University] [Java, C]
5. @FunctionalInterface
Diperkenalkan di Java 8, anotasi ini menunjuk sebuah antarmuka sebagai antarmuka fungsional—sebuah antarmuka dengan satu metode abstrak. Kompiler memverifikasi keterbatasan ini.
Contoh
@FunctionalInterface public interface MyFuncInterface { void firstMethod(); // abstract }
Menambahkan metode abstrak kedua memicu kesalahan kompilasi:
@FunctionalInterface public interface MyFuncInterface { void firstMethod(); void secondMethod(); // compile-time error }
Beberapa metode default atau static diizinkan.
@FunctionalInterface public interface MyFuncInterface { void firstMethod(); default void secondMethod() { /* ... */ } default void thirdMethod() { /* ... */ } }
Anotasi Kustom
Pengembang dapat membuat anotasi yang sesuai dengan kebutuhan spesifik aplikasi. Sintaks menggunakan @interface dan dapat mencakup metode elemen dengan nilai default opsional.
Sintaks
@interface AnnotationName { ElementType elementName() default defaultValue; }
Contoh
@interface MyCustomAnnotation { String value() default "default value"; } class Main { @MyCustomAnnotation(value = "programiz") public void method1() { System.out.println("Test method 1"); } public static void main(String[] args) { new Main().method1(); } }
Output
Test method 1
Meta-anotasi mengonfigurasi bagaimana anotasi lain berperilaku.
1. @Retention
Mendefinisikan lingkup visibilitas anotasi: SOURCE, CLASS, atau RUNTIME.
@Retention(RetentionPolicy.RUNTIME) public @interface MyAnnotation { }
2. @Documented
Memastikan anotasi muncul dalam Javadoc yang dihasilkan.
@Documented public @interface MyAnnotation { }
3. @Target
Membatasi anotasi ke elemen program tertentu.
@Target(ElementType.METHOD) public @interface MyAnnotation { }
Tipe elemen termasuk ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE.
4. @Inherited
Mengizinkan subclass untuk mewarisi anotasi yang ada pada superclass.
@Inherited public @interface MyAnnotation { }
5. @Repeatable
Mengizinkan anotasi diterapkan beberapa kali pada elemen yang sama. Memerlukan anotasi wadah.
@Repeatable(Universities.class) public @interface University { String name(); } public @interface Universities { University[] value(); }
Penggunaan:
@University(name = "TU") @University(name = "KU") private String uniName;
Untuk mengakses data anotasi pada waktu runtime, gunakan metode getAnnotationsByType() atau getAnnotations() dari Reflection API.