Sobes.tech
Middle

Kotlin'da izohlar bilan ishlashning xususiyatlari qanday?

sobes.tech AI

AIdan javob

Kotlin'dagi izohlar Java'dagi izohlarga o'xshaydi, ammo ularning bir qator xususiyatlari mavjud:

  • Sintaksis: Izohlar, ular qo'llaniladigan elementdan oldin joylashtiriladi, @ belgisidan foydalanilmaydi.
  • Runtime'da foydalanish: Standart holda, izohlar runtime'da saqlanmaydi. Ularni saqlash uchun @Retention(AnnotationRetention.RUNTIME) meta-izohidan foydalanish kerak.
  • Turlar uchun qo'llash: Izohlar faqat sinflar, funksiyalar va mulklarga emas, balki turlarga ham qo'llanilishi mumkin (masalan, @NonNull String). Buning uchun typealias ishlatiladi.
  • Konstruktorlarni izohlash: Bir sinfning asosiy konstruktorini izohlash uchun constructor kalit so'zi ishlatiladi. Ikkinchi darajali konstruktorlar uchun izoh to'g'ridan-to'g'ri ularning oldiga qo'yiladi.
  • Mulklarga va ularning accessorlariga izoh: Izohlar mulkga, uning getter'iga (@get:) yoki setter'iga (@set:) qo'llanilishi mumkin.
  • Konstruktor parametrlariga izoh: Asosiy konstruktor parametrlariga qo'llanadigan izohlar, bu mulkni ham izohlashadi. Bu parametrni izohlash uchun @param: ishlatiladi.
  • Funktsiya va metod parametrlariga izoh: Izohlar to'g'ridan-to'g'ri parametrdan oldin joylashtiriladi.
  • Reflection bilan ishlash: Kotlin reflection (kotlin-reflect) yordamida, agar @Retention(AnnotationRetention.RUNTIME) ishlatilgan bo'lsa, runtime'da izohlar haqida ma'lumot olish mumkin.
  • Qo'llash sohalari: Izohlar, maqsadni aniq ko'rsatish uchun prefikslar yordamida ma'lumot berishi mumkin:
    • @file: - fayl uchun
    • @property: - mulk uchun
    • @field: - mulk uchun yaratilgan maydon uchun
    • @get: - mulk uchun getter uchun
    • @set: - mulk uchun setter uchun
    • @param: - konstruktor parametri uchun
    • @setparam: - mulk setter parametri uchun
    • @delegate: - delegat maydoni uchun
    • @use-site: - foydalanish joyini ko'rsatish uchun, maqsad aniq ko'rsatilmagan hollarda

Misol uchun, izoh yaratish va foydalanish:

// Anotatsiya ta'rifi
@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation(val value: String)

// Anotatsiyadan foydalanish
@MyAnnotation("Hello")
class MyClass {

    @get:MyAnnotation("World")
    val myProperty: String = "some value"

    constructor(@param:MyAnnotation("ConstructorParam") param: Int) {
        // ...
    }

    fun myFunction(@MyAnnotation("FunctionParam") param: String) {
        // ...
    }
}