JavaRush /Kurslar /All lectures for UZ purposes /Anotatsiyalar parametrlari

Anotatsiyalar parametrlari

All lectures for UZ purposes
Daraja, Dars
Mavjud

Anotatsiyalar mexanizmidan foyda JDKdagi tayyor standart anotatsiyalarni ishlatishda emas. Lekin o'z anotatsiyangizni yaratishga ehtiyoj kamdan-kam hollarda paydo bo'ladi. Masalan, katta tizim yaratmoqchi bo'lsak yoki alohida kutubxona ajratmoqchi bo'lsak, o'z anotatsiyamizni amalga oshirish arxitektura darajasida albatta foyda keltiradi.

Keling, anotatsiya yaratishni harakat qilib ko'ramiz.

Buning uchun fayl yaratamiz va class yoki interface o'rniga @interface deb yozamiz. Bu bizning anotatsiya faylimiz bo'ladi. Ichki tuzilishi jihatidan anotatsiya interfeysga o'xshaydi.


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

@interface - bu anotatsiya ekanligini bildiradi,
default - parametrning standart qiymatini qaytarishini bildiradi.

Biz anotatsiyani yaratdik va nazariy jihatdan uni allaqachon ishlatishimiz mumkin, lekin avvalo uning konfiguratsiyasi bilan shug'ullanish yaxshiroq.

Masala shundaki, konfiguratsiyasiz bizning anotatsiyamiz har qanday joyda qo'llanilishi mumkin (klass, metod, atributlar va h.k.), shuning uchun uni ishlatishga uncha ma'no yo'q. Qanday g'alati tuyulmasin, bizning anotatsiyamizni boshqa anotatsiyalar bilan anotatsiyalashtirish kerak!

@Target bilan boshlaymiz.

@Target anotatsiyasi (Java 1.5 dan aktual) konfiguratsiyaning qo'llanilish imkoniyatlarini cheklaydi. Ma'lum bir darajagacha cheklash uchun @Target anotatsiyasiga parametrni topshirishimiz kerak, bu parametr qaysi turlar uchun qo'llanishi mumkinligini bildiradi. Quyida tez-tez ishlatiladigan turlardan ba'zilari:

@Target(ElementType.PACKAGE) paketlar uchun
@Target(ElementType.TYPE) klasslar uchun
@Target(ElementType.CONSTRUCTOR) konstruktorlar uchun
@Target(ElementType.METHOD) metodlar uchun
@Target(ElementType.FIELD) klass atributlari (o'zgaruvchilar) uchun
@Target(ElementType.PARAMATER) metod parametrlari uchun
@Target(ElementType.LOCAL_VARIABLE) mahalliy o'zgaruvchilar uchun

Bir nechta turdagi anotatsiyaga ehtiyoj bo'lsa, u holda bir nechta parametrlarni massiv sifatida o'tkazish mumkin:


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

Keyingi muhim konfiguratsiya elementi — @Retention anotatsiyasi.

U bu kodning qaysi hayot siklida bizga mavjud bo'lishini bildiradi:

RetentionPolicy.SOURCE SOURCE saqlash siyosati bilan anotatsiyalangan anotatsiyalar ishlov berishda tashlanadi.
RetentionPolicy.CLASS CLASS saqlash siyosati bilan anotatsiyalangan anotatsiyalar .class faylida yoziladi, lekin bajarilishi vaqti o'chiriladi.
RetentionPolicy.RUNTIME RUNTIME saqlash siyosati bilan anotatsiyalangan anotatsiyalar bajarilishi vaqti saqlanadi va bizning dasturimizda bajarilish vaqtida mavjud bo'lishi mumkin.

Konfiguratsiya uchun bir nechta anotatsiyalarni ham ishlatish mumkin:

Anotatsiya Qiymati
@Inherited Avlod klassiga ota-klassning anotatsiyalarini meros qilib olish imkoniyatini beradi.
@Documented Anotatsiya javadoc tomonidan yaratilgan hujjatga qo'shiladi.

Endi o'z anotatsiyamizni yaratishni harakat qilib ko'ramiz.

Kodning muallifi va versiyasi haqida ma'lumotni ichiga oladigan va klasslarni va metodlarni anotatsiyalaydigan anotatsiyani yaratamiz:


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

Bizning anotatsiyamizni klasslar va metodlarga qo'llashimiz mumkin. Bizning anotatsiyamizning metadatalari dastur bajarilishi vaqtida mavjud bo'ladi. Anotatsiyamizning parametrlari e'tiborga loyiq. Biz ikkita parametrni qo'ya olamiz: ism va versiya, lekin qo'ymasligimiz ham mumkin, bu holda biz keltirilgan standart qiymatlar (default "Author" va default "0.0") olinadi.

Ta'kidlash joizki, biz parametrlar uchun standart qiymatlarni keltirmasak ham bo'ladi. Bu holda bu parametrni kiritish majburiy bo'ladi.

Parametrlarni uzatishda value = "value" orqali uzatilayotgan parametrni ko'rsatish majburiydir. Bu ko'rsatish har doim kerak, hatto anotatsiyadagi parametr yagona bo'lsa ham.

Anotatsiyamizni bir necha klasslarga qo'llaymiz:


@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() {}
}
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION