Sobes.tech
Junior

Чӣ гуна истифода бурдани ёддоштҳо дар Kotlin?

sobes.tech AI

Ҷавоб аз AI

Аннотацияҳо дар Kotlin барои илова кардани маълумоти мета ба синфҳо, хусусиятҳо, функсияҳо, изразҳо ва параметрҳо истифода мешаванд. Онҳо амалҳои мустақимро иҷро намекунанд, аммо метавонанд аз ҷониби компилятор, рамкаҳо ё китобхонаҳои дигар барои коркарди гуногун истифода шаванд.

Аспектҳои асосии истифода:

  1. Синтаксис: Аннотацияҳо пеш аз унсуре, ки ба он татбиқ мешаванд, дар зикрҳои кунҷӣ @ ҷойгир карда мешаванд. Агар аннотация параметр дошта бошад, онҳо дар зикрҳои баъд аз ном дар зикрҳо нишон дода мешаванд.

    @Deprecated("Use newFunction instead")
    fun oldFunction() {
        // ...
    }
    
    @JvmStatic
    fun staticMethod() {
        // ...
    }
    
  2. Татбиқ ба унсурҳои гуногун: Аннотацияҳо метавонанд ба:

    • Синфҳо (class):
      @Serializable
      class User(val name: String)
      
    • Хусусиятҳо (val, var):
      @Inject
      lateinit var userRepository: UserRepository
      
    • Функсияҳо (fun):
      @Test
      fun testSomething() {
          // ...
      }
      
    • Параметрҳои конструкторҳо/функсияҳо:
      fun processUser(@NotNull user: User) {
          // ...
      }
      
    • Изразҳо:
      fun calculate(@Ignore parameter: Int) {
          // ...
      }
      
    • Намудҳо (@Target(AnnotationTarget.TYPE)):
      val list: @NotNull List<String> = emptyList()
      
  3. Ҷоҳои истифода (Use-site Targets): Барои тафовут додан ба он ки аннотация ба кадом унсур татбиқ мешавад, вақте ки чандин ҳаст (масалан, майдону геттер), use-site targets истифода мешаванд.

    Target Тавсиф
    @file: Ба тамоми файл татбиқ мешавад
    @property: Ба тамоми хусусият татбиқ мешавад
    @field: Ба майдони backing (пешбар) татбиқ мешавад
    @get: Ба геттери хусусият татбиқ мешавад
    @set: Ба сеттери хусусият татбиқ мешавад
    @param: Ба параметри конструктор/функсия татбиқ мешавад
    @setparam: Ба параметри сеттер татбиқ мешавад
    @delegate: Ба намунаи хусусияти делегат татбиқ мешавад
    @receiver: Ба навъи қабулкунанда татбиқ мешавад
    class Example(@field:Inject val dependency: Dependency) {
        // @field:Inject ба майдони 'dependency' татбиқ мешавад
    }
    
  4. Эълони аннотацияҳои худ: Аннотацияҳои шахсӣ бо калиди annotation class эълон карда мешаванд. Параметрҳои аннотация метавонанд намудҳои primitives, сатрҳо, синфҳо (KClass), enumeration, дигар аннотацияҳо ё массивҳои ин намудҳоро дошта бошанд.

    annotation class MyAnnotation(val value: String, val count: Int = 0)
    
    @MyAnnotation("Hello", count = 5)
    class AnnotatedClass {
        // ...
    }
    
  5. Аннотацияҳои мета: Аннотацияҳо метавонанд бо мета-аннотацияҳо ишора шаванд, ки рафтор ва истифодаи онҳоро муайян мекунанд.

    • @Target: нишон медиҳад, ки кадом унсурҳо метавонанд аннотатсия шаванд.
    • @Retention: нишон медиҳад, ки дар кадом марҳилаи ҳаёти онҳо мавҷуд бошанд (SOURCE, BINARY, RUNTIME).
    • @Repeatable: имкон медиҳад, ки як аннотация чанд маротиба ба як унсур татбиқ шавад.
    • @MustBeDocumented: нишон медиҳад, ки аннотация бояд қисми API-и умумӣ бошад, ки воситаҳои ҳуҷҷатгузорӣ мебаранд.
    @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProcessedByFramework
    

Аннотацияҳо дар Kotlin барои ҳамгироӣ бо рамкаҳои JVM (Spring, Android), сериализатсия (Kotlinx.serialization), озмоишҳо (JUnit) ва эҷоди китобхонаҳои шахсӣ, ки асос ёфтаанд ба мета-маълумот, васеъ истифода мешаванд.