Sobes.tech
Junior

Jak používat anotace v Kotlinu?

sobes.tech AI

Odpověď od AI

Anotace v Kotlinu se používají k přidání meta-informací ke třídám, vlastnostem, funkcím, výrazům a parametrům. Nevykonávají přímou akci, ale mohou být použity kompilátorem, rámci nebo jinými knihovnami pro různé zpracování.

Hlavní aspekty použití:

  1. Syntaxe: Anotace se uvádějí před prvkem, ke kterému se vztahují, v hranatých závorkách @. Pokud má anotace parametry, jsou uvedeny v závorkách za názvem.

    @Deprecated("Use newFunction instead")
    fun oldFunction() {
        // ...
    }
    
    @JvmStatic
    fun staticMethod() {
        // ...
    }
    
  2. Použití na různé prvky: Anotace lze použít na:

    • Třídy (class):
      @Serializable
      class User(val name: String)
      
    • Vlastnosti (val, var):
      @Inject
      lateinit var userRepository: UserRepository
      
    • Funkce (fun):
      @Test
      fun testSomething() {
          // ...
      }
      
    • Parametry konstruktorů/funkcí:
      fun processUser(@NotNull user: User) {
          // ...
      }
      
    • Výrazy:
      fun calculate(@Ignore parameter: Int) {
          // ...
      }
      
    • Typy (@Target(AnnotationTarget.TYPE)):
      val list: @NotNull List<String> = emptyList()
      
  3. Místa použití (Use-site Targets): Pro disambiguaci toho, ke kterému prvku se anotace vztahuje, když jich je více (například pole a getter), se používají use-site targets.

    Target Popis
    @file: Vztahuje se na celý soubor
    @property: Vztahuje se na celou vlastnost
    @field: Vztahuje se k backing fieldu
    @get: Vztahuje se k getteru vlastnosti
    @set: Vztahuje se k setteru vlastnosti
    @param: Vztahuje se k parametru konstruktoru nebo funkce
    @setparam: Vztahuje se k parametru setteru
    @delegate: Vztahuje se k instanci delegované vlastnosti
    @receiver: Vztahuje se k typu příjemce
    class Example(@field:Inject val dependency: Dependency) {
        // @field:Inject se vztahuje na pole 'dependency'
    }
    
  4. Vytváření vlastních anotací: Vlastní anotace se deklarují klíčovým slovem annotation class. Parametry anotace mohou být primitivními typy, řetězci, třídami (KClass), enumy, jinými anotacemi nebo poli těchto typů.

    annotation class MyAnnotation(val value: String, val count: Int = 0)
    
    @MyAnnotation("Hello", count = 5)
    class AnnotatedClass {
        // ...
    }
    
  5. Meta-anotace: Anotace mohou být označeny meta-anotacemi, které určují jejich chování a použitelnost.

    • @Target: Určuje, které prvky mohou být anotovány.
    • @Retention: Určuje, v jaké fázi životního cyklu je anotace přítomna (SOURCE, BINARY, RUNTIME).
    • @Repeatable: Umožňuje opakované použití anotace na stejném prvku.
    • @MustBeDocumented: Určuje, že anotace by měla být součástí veřejného API generovaného dokumentačními nástroji.
    @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProcessedByFramework
    

Anotace jsou široce používány v Kotlinu pro integraci s JVM frameworky (Spring, Android), serializaci (Kotlinx.serialization), testování (JUnit) a tvorbu vlastních knihoven založených na meta-informacích.