Sobes.tech
Middle

Kokios yra darbo su anotacijomis Kotlin'e savybės?

sobes.tech AI

Atsakymas iš AI

Kotlin anotacijos yra panašios į Java anotacijas, tačiau turi keletą ypatybių:

  • Sintaksė: Anotacijos dedamos prieš elementą, prie kurio jos taikomos, be @ ženklo.
  • Naudojimas run-time: Pagal numatytuosius nustatymus anotacijos run-time'e nėra saugomos. Norint jas išsaugoti, reikia naudoti meta-anotaciją @Retention(AnnotationRetention.RUNTIME).
  • Taikymas tipui: Anotacijos galima taikyti ne tik klasėms, funkcijoms ir savybėms, bet ir tipams (pvz., @NonNull String). Tam naudojamas typealias.
  • Konstruktoriaus anotavimas: Pagrindiniam konstruktoriui anotaciją taikyti naudojamas žodis constructor. Anotacija tiesiogiai prieš jį.
  • Savybių ir jų accessor'ų anotavimas: Anotacijos gali būti taikomos pačiai savybei, jos getter'ui (@get:) arba setter'ui (@set:).
  • Konstruktoriaus parametrų anotavimas: Anotacijos, taikomos pagrindinio konstruktoriaus parametrams, anotuoja šiuos parametrus. Tam naudojamas @param:.
  • Funkcijų ir metodų parametrų anotavimas: Anotacijos taikomos tiesiog prieš parametrą.
  • Reflection naudojimas: Kotlin reflection (knygynas kotlin-reflect) leidžia gauti informaciją apie anotacijas run-time, jei naudojama @Retention(AnnotationRetention.RUNTIME).
  • Taikymo sritis: Anotacijos gali turėti tikslinį deklaravimą su prefiksais:
    • @file: - failui
    • @property: - savybei
    • @field: - laukui, kuris sugeneruotas savybei
    • @get: - getter'ui
    • @set: - setter'ui
    • @param: - konstruktoriaus parametrui
    • @setparam: - savybės setter'io parametrui
    • @delegate: - delegato laukui
    • @use-site: - naudojimo vietai, kai tikslią vietą sunku tiksliai nurodyti

Pavyzdys sukūrimo ir naudojimo:

// Anotacijos apibrėžimas
@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation(val value: String)

// Anotacijos naudojimas
@MyAnnotation("Hello")
class MyClass {

    @get:MyAnnotation("World")
    val myProperty: String = "koks nors reikšmė"

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

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