Middle
Aké sú vlastnosti práce s anotáciami v Kotlin?
sobes.tech AI
Odpoveď od AI
Annotácie v Kotlin sú podobné anotáciám v Jave, ale majú niekoľko špecifík:
- Syntax: Anotácie sa umiestňujú pred prvok, na ktorý sa vzťahujú, bez symbolu
@. - Použitie v run-time: Predvolene sa anotácie neuchovávajú v run-time. Na ich uchovanie je potrebné použiť meta-anotáciu
@Retention(AnnotationRetention.RUNTIME). - Aplikácia na typ: Anotácie je možné aplikovať nielen na triedy, funkcie a vlastnosti, ale aj na typy (napríklad
@NonNull String). Na to sa používatypealias. - Anotovanie konštruktorov: Na anotovanie hlavného konštruktora triedy sa používa kľúčové slovo
constructor. Pri sekundárnych konštruktoch sa anotácia umiestňuje priamo pred nimi. - Anotovanie vlastností a ich accessorov: Anotácie je možné aplikovať na vlastnosť, jej getter (
@get:) alebo setter (@set:). - Anotovanie parametrov konštruktora pre vlastnosti: Anotácie, ktoré sa aplikujú na parametre hlavného konštruktora, ktorý súčasne predstavujú vlastnosti, anotujú tieto vlastnosti. Na anotovanie samotného parametra sa používa
@param:. - Anotovanie parametrov funkcií a metód: Anotácie sa aplikujú priamo pred parameter.
- Práca s anotáciami v reflection: Kotlin reflection (knižnica
kotlin-reflect) umožňuje získavať informácie o anotáciách v run-time za podmienky@Retention(AnnotationRetention.RUNTIME). - Oblasť použitia: Anotácie môžu mať cieľové vyhlásenie pomocou prefixov:
@file:- pre súbor@property:- pre vlastnosť@field:- pre pole, generované pre vlastnosť@get:- pre getter vlastnosti@set:- pre setter vlastnosti@param:- pre parameter konštruktora@setparam:- pre parameter settera vlastnosti@delegate:- pre delegátne pole@use-site:- pre použitie miesta, keď je ťažké presne určiť cieľ
Príklad vytvorenia a použitia anotácie:
// Definovanie anotácie
@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation(val value: String)
// Použitie anotácie
@MyAnnotation("Hello")
class MyClass {
@get:MyAnnotation("World")
val myProperty: String = "nejaká hodnota"
constructor(@param:MyAnnotation("ConstructorParam") param: Int) {
// ...
}
fun myFunction(@MyAnnotation("FunctionParam") param: String) {
// ...
}
}