Sobes.tech
Junior

Kotlinде аннотацияларды кантип колдонуу керек?

sobes.tech AI

AIден жооп

Котлинде аннотациялар мета-маалымат кошуу үчүн колдонулат, алар класстарга, мүчөлөргө, функцияларга, билдирүүлөргө жана параметрлерге колдонулат. Алар түздөн-түз иштебейт, бирок компилятор, фреймворк же башка китепканалар тарабынан ар кандай иштетүү үчүн колдонулушу мүмкүн:

Көп колдонуу аспектилери:

  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: Бекитүү талаасына колдонулат
    @get: Мүчөнүн getter'ине колдонулат
    @set: Мүчөнүн setter'ине колдонулат
    @param: Конструктор/функция параметрине колдонулат
    @setparam: Мүчө setter параметрине колдонулат
    @delegate: Делегирленген мүчө инстансине колдонулат
    @receiver: Алуучу түргө колдонулат
    class Example(@field:Inject val dependency: Dependency) {
        // @field:Inject колдонулат 'dependency' талаасына
    }
    
  4. Колдонуучу аныкталган аннотацияларды жарыялоо: Өзгөчө аннотациялар annotation class менен жарыяланат. Аннотациянын параметрлери примитивдик түрлөр, саптар, класстар (KClass), тизмелер, башка аннотациялар же алардын массивдери болушу мүмкүн:

    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
    

Аннотациялар Котлинде JVM фреймворктөрү (Spring, Android), сериализация (Kotlinx.serialization), тестирлөө (JUnit) жана өзүнчө китепканалар түзүү үчүн кеңири колдонулат, алардын мета-маалыматка негизделген.