Sobes.tech
Middle

Jaké jsou vlastnosti práce s anotacemi v Kotlinu?

sobes.tech AI

Odpověď od AI

Komentáře v Kotlinu jsou podobné komentářům v Javě, ale mají několik vlastností:

  • Syntaxe: Komentáře se umisťují před prvek, na který se vztahují, bez symbolu @.
  • Použití v době běhu: Ve výchozím nastavení se komentáře neukládají do doby běhu. Pro jejich zachování je nutné použít meta-annotaci @Retention(AnnotationRetention.RUNTIME).
  • Aplikace na typ: Komentáře lze aplikovat nejen na třídy, funkce a vlastnosti, ale také na typy (například @NonNull String). K tomu se používá typealias.
  • Komentování konstruktorů: Pro komentování hlavního konstruktoru třídy se používá klíčové slovo constructor. U sekundárních konstruktorů je komentář umístěn přímo před nimi.
  • Komentování vlastností a jejich accessorů: Komentáře lze aplikovat na vlastnost, její getter (@get:) nebo setter (@set:).
  • Komentování parametrů konstruktoru: Komentáře aplikované na parametry hlavního konstruktoru, které jsou zároveň vlastnostmi, komentují tyto vlastnosti. Pro komentování samotného parametru se používá @param:.
  • Komentování parametrů funkcí a metod: Komentáře jsou umístěny přímo před parametrem.
  • Práce s komentáři v reflexi: Kotlin reflexe (kotlin-reflect) umožňuje získat informace o komentářích v době běhu, pokud je použita @Retention(AnnotationRetention.RUNTIME).
  • Oblast použití: Komentáře mohou mít cílové oznámení pomocí prefixů:
    • @file: - pro soubor
    • @property: - pro vlastnost
    • @field: - pro pole generované pro vlastnost
    • @get: - pro getter vlastnosti
    • @set: - pro setter vlastnosti
    • @param: - pro parametr konstruktoru
    • @setparam: - pro parametr setteru vlastnosti
    • @delegate: - pro pole delegata
    • @use-site: - pro použití místa, když není možné přesně určit cíl

Příklad vytvoření a použití anotace:

// Definice anotace
@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation(val value: String)

// Použití anotace
@MyAnnotation("Hello")
class MyClass {

    @get:MyAnnotation("World")
    val myProperty: String = "nějaká hodnota"

    constructor(@param:MyAnnotation("ConstructorParam") param: Int) {
        // ...
    }

    fun myFunction(@MyAnnotation("FunctionParam") param: String) {
        // ...
    }
}