Аннотация @Repeatable
Аннотация @Repeatable позволяет применять одну и ту же аннотацию
несколько раз к одному элементу кода. Без этой аннотации компилятор
выдаст ошибку при попытке использовать аннотацию более одного раза.
Для работы @Repeatable необходимо объявить аннотацию-контейнер,
которая будет хранить массив повторяемых аннотаций.
Импорт
import kotlin.annotation.AnnotationRetention
import kotlin.annotation.AnnotationTarget
import kotlin.annotation.Repeatable
import kotlin.annotation.Retention
import kotlin.annotation.Target
Синтаксис
@Target(AnnotationTarget.ANNOTATION_CLASS)
@Retention(AnnotationRetention.SOURCE)
public annotation class Repeatable
Пример
Создадим повторяемую аннотацию Tag
для маркировки методов:
@Repeatable
@Retention(AnnotationRetention.SOURCE)
annotation class Tag(val name: String)
annotation class Tags(vararg val values: Tag)
Пример
Применим аннотацию @Tag несколько раз
к одному методу:
@Tag("important")
@Tag("optimized")
@Tag("v1.0")
fun calculateSum(a: Int, b: Int): Int {
return a + b
}
Пример
Создадим повторяемую аннотацию для валидации полей:
@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
)
Пример
Использование повторяемых аннотаций для документации:
@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
}
Пример
Доступ к повторяемым аннотациям через рефлексию:
@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)
}
}
Результат выполнения кода:
@Authors(values=[@Author(name=John Doe), @Author(name=Jane Smith)])
Смотрите также
-
ключевое слово
annotation,
для создания собственных аннотаций -
ключевое слово
target,
для указания целей применения аннотаций -
ключевое слово
retention,
для указания времени жизни аннотаций -
ключевое слово
class,
для создания классов и аннотаций