Sobes.tech
Middle

Koje su osobine rada sa anotacijama u Kotlinu?

sobes.tech АИ

Одговор од АИ

Annotacije u Kotlinu slične su anotacijama u Javi, ali imaju određene osobine:

  • Sintaksa: Anotacije se postavljaju pre elementa na koji se primenjuju, bez simbola @.
  • Korišćenje u run-time: Po default-u, anotacije se ne čuvaju u run-time. Za čuvanje je potrebno koristiti meta-anotaciju @Retention(AnnotationRetention.RUNTIME).
  • Primena na tip: Anotacije se mogu primenjivati ne samo na klase, funkcije i svojstva, već i na tipove (npr. @NonNull String). Za to se koristi typealias.
  • Anotiranje konstruktora: Za anotiranje glavnog konstruktora klase koristi se ključna reč constructor. Za sekundarne konstruktore, anotacija se postavlja neposredno pre njih.
  • Anotiranje svojstava i njihovih pristupnika: Anotacije se mogu primenjivati na sam atribut, njegov getter (@get:) ili setter (@set:).
  • Anotiranje parametara konstruktora za svojstva: Anotacije koje se primenjuju na parametre glavnog konstruktora, koji su istovremeno i svojstva, anotiraju ta svojstva. Za anotiranje samog parametra koristi se @param:.
  • Anotiranje parametara funkcija i metoda: Anotacije se primenjuju neposredno pre parametra.
  • Rad sa anotacijama u reflection: Kotlin reflection (biblioteka kotlin-reflect) omogućava dobijanje informacija o anotacijama u run-time uz uslov @Retention(AnnotationRetention.RUNTIME).
  • Oblast primene: Anotacije mogu imati ciljno deklarisanje pomoću prefiksa:
    • @file: - za fajl
    • @property: - za svojstvo
    • @field: - za polje, generisano za svojstvo
    • @get: - za getter svojstva
    • @set: - za setter svojstva
    • @param: - za parametar konstruktora
    • @setparam: - za parametar seta svojstva
    • @delegate: - za delegat polje
    • @use-site: - za korišćenje lokacije, kada je teško precizno odrediti cilj

Primer kreiranja i korišćenja anotacije:

// Definisanje anotacije
@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation(val value: String)

// Korišćenje anotacije
@MyAnnotation("Hello")
class MyClass {

    @get:MyAnnotation("World")
    val myProperty: String = "neka vrednost"

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

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