Apa itu anotasi metadata?
Dimulai dengan simbol @, berfungsi menambahkan informasi statis tambahan pada kode. Dibaca oleh kompiler, IDE dan penganalisis statis, tidak mengubah logika saat program berjalan.
Dua format penulisan yang valid:
- Konstanta bawaan waktu kompilasi:
@override,@deprecated - Pemanggilan konstruktor konstanta:
@Deprecated("Teks peringatan"), anotasi buatan sendiri seperti@Todo("xxx", "xxx")
Biasanya diterapkan pada kelas, metode, variabel, fungsi, parameter, import, enum dan elemen kode lainnya.
@Deprecated
Menandai API yang sudah usang. Wajib tuliskan pengganti dan tanggal penghapusan. Terdapat juga metode statis untuk batasan skenario khusus.
class Television {
/// Pengganti: gunakan turnOn
@Deprecated('Gunakan turnOn() sebagai gantinya, metode ini akan dihapus akhir tahun 2026')
void activate() {
turnOn();
}
void turnOn() {
print("TV dinyalakan");
}
}
// Contoh batasan khusus untuk API usang
@Deprecated.instantiate() // Larang instansiasi kelas ini dengan new
class OldDevice {}
@Deprecated.extend() // Larang kelas lain mewarisi kelas ini
class Base {}
// Mencoba mewarisi Base akan memunculkan peringatan di editor
class Sub extends Base {}
void main() {
Television tv = Television();
// Memanggil metode @Deprecated akan tampil garis coret + peringatan IDE
tv.activate();
// Metode baru yang disarankan
tv.turnOn();
// Membuat instansi OldDevice memicu peringatan @Deprecated.instantiate()
OldDevice device = OldDevice();
}
Code language: Dart (dart)
Kode di atas tetap bisa dikompilasi dan dijalankan normal, hanya akan muncul peringatan di IDE dan kompiler. Anda bisa mencobanya menggunakan Android Studio atau IntelliJ IDEA.
@deprecated
Tanpa pesan kustom, hanya penanda usang sederhana. Sebaiknya gunakan @Deprecated("Penjelasan")
@deprecated
void oldFunc() {}
Code language: Dart (dart)
@override
Menandai anggota yang menimpa nama sama dari induk kelas / antarmuka. IDE akan validasi: jika salah tulis nama metode akan muncul error merah.
class Animal {
void speak() {}
}
class Dog extends Animal {
// @override menandai penimpaan metode speak milik induk
@override
void speak() {
print("Guk guk");
}
}
class Cat extends Animal {
@override
void speak() {
print("Meong");
}
}
class Pig extends Animal {
// Tidak ada penimpaan
}
void main() {
Animal dog = Dog();
Animal cat = Cat();
Animal pig = Pig();
dog.speak(); // Keluaran: Guk guk
cat.speak(); // Keluaran: Meong
pig.speak();
}
Code language: Dart (dart)
@pragma
Mengirim perintah optimasi tingkat rendah atau identifikasi ke kompiler dan penganalisis statis, umum dipakai untuk pengembangan tingkat dasar.
// Contoh: Beri tahu kompiler untuk inline fungsi ini
@pragma('vm:prefer-inline')
int add(int a, int b) => a + b;
Code language: Dart (dart)