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 koristitypealias. - 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) {
// ...
}
}