Аннотация @Repeatable

Аннотация @Repeatable позволяет применять одну и ту же аннотацию несколько раз к одному элементу кода. Без этой аннотации компилятор выдаст ошибку при попытке использовать аннотацию более одного раза. Для работы @Repeatable необходимо объявить аннотацию-контейнер, которая будет хранить массив повторяемых аннотаций.

Импорт

kotlinimport kotlin.annotation.AnnotationRetention
import kotlin.annotation.AnnotationTarget
import kotlin.annotation.Repeatable
import kotlin.annotation.Retention
import kotlin.annotation.Target

Синтаксис

kotlin@Target(AnnotationTarget.ANNOTATION_CLASS)
@Retention(AnnotationRetention.SOURCE)
public annotation class Repeatable

Пример

Создадим повторяемую аннотацию Tag для маркировки методов:

kotlin@Repeatable
@Retention(AnnotationRetention.SOURCE)
annotation class Tag(val name: String)

annotation class Tags(vararg val values: Tag)

Пример

Применим аннотацию @Tag несколько раз к одному методу:

kotlin@Tag("important")
@Tag("optimized")
@Tag("v1.0")
fun calculateSum(a: Int, b: Int): Int {
  return a + b
}

Пример

Создадим повторяемую аннотацию для валидации полей:

kotlin@Repeatable
@Retention(AnnotationRetention.RUNTIME)
annotation class Validation(val rule: String)

annotation class Validations(vararg val values: Validation)

data class User(
  @Validation("min:3")
  @Validation("max:20")
  @Validation("required")
  val username: String,
  
  @Validation("email")
  @Validation("required")
  val email: String
)

Пример

Использование повторяемых аннотаций для документации:

kotlin@Repeatable
@Retention(AnnotationRetention.SOURCE)
annotation class Todo(val task: String)

annotation class Todos(vararg val values: Todo)

@Todo("optimize algorithm")
@Todo("add error handling")
@Todo("write unit tests")
fun processData(data: List<String>) {
  // implementation
}

Пример

Доступ к повторяемым аннотациям через рефлексию:

kotlin@Repeatable
@Retention(AnnotationRetention.RUNTIME)
annotation class Author(val name: String)

annotation class Authors(vararg val values: Author)

@Author("John Doe")
@Author("Jane Smith")
class DocumentProcessor

fun main() {
  val annotations = DocumentProcessor::class.annotations
  for (annotation in annotations) {
    println(annotation)
  }
}

Результат выполнения кода:

kotlin@Authors(values=[@Author(name=John Doe), @Author(name=Jane Smith)])

Смотрите также

  • ключевое слово annotation,
    для создания собственных аннотаций
  • ключевое слово target,
    для указания целей применения аннотаций
  • ключевое слово retention,
    для указания времени жизни аннотаций
  • ключевое слово class,
    для создания классов и аннотаций