2005 yilda Java 5 versiyasi bilan bizga annotatsiyalar nomli yangi tushunchalar tanishtirildi.
Annotatsiyalar — bu sintaktik metama'lumotlarning o'ziga xos shaklidir, ularni kodda e'lon qilish mumkin. Ular kodni kompilatsiya qilish yoki dastur bajarilishi vaqtida tahlil qilish uchun ishlatiladi. Annotatsiyani kompilator uchun belgi, marker yoki ko'rsatma bilan solishtirish mumkin.
Sen, albatta, annotatsiyalar bilan allaqachon tanishsan. Masalan, ota-sinf metodining qayta belgilashida metod oldidan @Override ni yozamiz. Bu annotatsiya bo'lib, u ota-sinf metodining farzand sinfda qayta belgilanayotganini ko'rsatadi.
Sintaksis:
@Override
public int hashCode() {
return super.hashCode();
}
Annotatsiyalar faqatgina metodlarga emasligini darhol eslatib o'tmoqchiman, chunki ularni paketlar, sinflar, metodlar, maydonlar va parametrlar bilan birgalikda ham qo'llash mumkin.
Annotatsiyalar qanday ishlashini tushunish uchun avval marker interfeysi tushunchasi bilan tanishamiz. Java dasturchilarida ma'lum sinfga ma'lum bir harakatlarni bajarish uchun uni qandaydir usulda belgilash zarurati til paydo bo'lganidan beri mavjud edi.
Java 5 gacha bunga mos kelmagan interfeys ishlatilgan. U hech qanday metodga ega emas edi, hech qanday shartnoma olib kelmasdan, sinfni alohida qilish uchun belgilardi.
Bunday interfeys 'marker interfeys' deb atalgan. Uning vazifasi JVM, kompilator yoki qandaydir kutubxona uchun sinflarni belgilash edi. Hozirgacha ba'zi marker interfeyslar mavjud, masalan, Serializable. Bu marker sinfni belgilash uchun foydalaniladi, bu sinfning ob'ektlari seriyalanishi mumkinligini bildiradi.
Annotatsiyalarning paydo bo'lishidan keyin ham marker interfeyslar ishlatilishda davom etayotganiga amin bo'ldik.
Annotatsiya va marker interfeysning teng ishlatilishi:
@MyAnnotation
public class MyClass {}
public class MyClass implements MarkerInterface {}
Ikkisining ham vazifasi bir xil bo'lsa-da, ularning amalga oshirilishida aniq farq bor. Sinfni ma'lum bir turga tegishli ekanini aniqlash uchun interfeys va annotatsiyani ko'rib chiqamiz.
Interfeys bilan sinfni belgilashda: noto'g'ri ishlatilsa va xato chiqsa, u kompilatsiya bosqichida aniqlanadi va dastur ishga tushmaydi.
Annotatsiyalar bilan hammasi oddiy emas: xato run-time'da aniqlanadi, demak dastur boshlanadi, lekin kutilganidek tugamaydi.
Agar sinfni kelajakda ishlatish imkoniyatini belgilash kerak bo'lsa, uning nusxalarini ma'lum bir metodga uzatish kerak:
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
}
Bu yerda marker interfeys eng yaxshi mos keladi.
Annotatsiyalarni kattaroq narsalar, masalan, annotatsiya orqali uzatiladigan parametrlar kerak bo'lganda ishlatish yaxshiroq.
Keling, JDK'dagi standart annotatsiyalarni ko'rib chiqamiz:
| Annotatsiya | Tavsif | Misol |
|---|---|---|
| @Override | Metodning superklass metodini qayta belgilayotganini yoki abstrakt sinf yoki interfeys metodini amalga oshirayotganini ko'rsatadi. | |
| @Deprecated | Kodni eskirgan deb belgilaydi. | |
| @SuppressWarnings | Annotatsiyalangan element uchun kompilator ogohlantirishlarini o'chiradi. Diqqat: agar bir nechta ogohlantirish kategoriyalarini o'chirish kerak bo'lsa, ularni jingalak qavslar ichiga qo'shish kerak, masalan, @SuppressWarnings ({"unchecked", "cast"}). | Ushbu misolda biz tipi (generic) aniqlanmagan ro'yxatga qo'shishga harakat qilamiz. Kompilator bizni bu haqida ogohlantiradi. Bu juda foydali bo'lsa-da, ba'zan ogohlantirishlar juda ko'p va juda shovqinli. Bunday holatda ushbu annotatsiyani ogohlantirish markeri parametrini ko'rsatgan holda metodega qo'llash mumkin. Markerlari juda ko'p, shuning uchun hammasini eslab o'tirish shart emas, odatda IDEA qaysi birini qo'yishni o'zi tavsiya qiladi. Bir nechta parametrlar bilan uzatilgan misol: |
GO TO FULL VERSION