Как да използвате анотации в Kotlin?
sobes.tech AI
Отговор от AI
Анотациите в Kotlin се използват за добавяне на метаинформация към класове, свойства, функции, изрази и параметри. Те не изпълняват директно действие, но могат да бъдат използвани от компилатора, рамки или други библиотеки за различна обработка.
Основни аспекти на използването:
-
Синтаксис: Анотациите се поставят пред елемента, към който се прилагат, в ъглови скоби
@. Ако анотацията има параметри, те се посочват в скоби след името.@Deprecated("Use newFunction instead") fun oldFunction() { // ... } @JvmStatic fun staticMethod() { // ... } -
Прилагане към различни елементи: Анотациите могат да се прилагат към:
- Класове (
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()
- Класове (
-
Места на прилагане (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' } -
Обявяване на потребителски анотации: Собствените анотации се обявяват с ключовата дума
annotation class. Параметрите на анотацията могат да бъдат примитивни типове, низове, класове (KClass), enum, други анотации или масиви от тези типове.annotation class MyAnnotation(val value: String, val count: Int = 0) @MyAnnotation("Hello", count = 5) class AnnotatedClass { // ... } -
Мета-анотации: Анотациите могат да бъдат маркирани с мета-анотации, които определят тяхното поведение и приложимост.
@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) и създаване на собствени библиотеки, базирани на метаинформация.