Sobes.tech
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žíva typealias.
  • 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) {
        // ...
    }
}