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 field-а
    @get: Прилага се към гетъра на свойството
    @set: Прилага се към сетъра на свойството
    @param: Прилага се към параметър на конструктор/функция
    @setparam: Прилага се към параметър на сетъра
    @delegate: Прилага се към инстанцията на делегираната собственост
    @receiver: Прилага се към типа на получателя
    class Example(@field:Inject val dependency: Dependency) {
        // @field:Inject се прилага към полето 'dependency'
    }
    
  4. Обявяване на потребителски анотации: Собствените анотации се обявяват с ключовата дума annotation class. Параметрите на анотацията могат да бъдат примитивни типове, низове, класове (KClass), enum, други анотации или масиви от тези типове.

    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) и създаване на собствени библиотеки, базирани на метаинформация.