Middle
Kādas ir iezīmes darbā ar anotācijām Kotlin?
sobes.tech AI
Atbilde no AI
Kotlin anotācijas ir līdzīgas Java anotācijām, bet tām ir vairākas īpatnības:
- Sintakse: Anotācijas tiek novietotas pirms elementa, uz kuru tās attiecas, bez
@simbols. - Lietošana run-time: Pēc noklusējuma anotācijas netiek saglabātas run-time. Lai tās saglabātu, jāizmanto meta-anotācija
@Retention(AnnotationRetention.RUNTIME). - Pielietojums tipam: Anotācijas var piemērot ne tikai klasēm, funkcijām un īpašībām, bet arī tipiem (piemēram,
@NonNull String). Tam tiek izmantotstypealias. - Konstruktora anotēšana: Galvenajam konstruktora anotēšanai tiek izmantots atslēgvārds
constructor. Sekundārajiem konstruktoriem anotācija tiek novietota tieši pirms tiem. - Īpašību un to accessor'u anotēšana: Anotācijas var piemērot pašai īpašībai, tās getter'iem (
@get:) vai setter'iem (@set:). - Konstruktora parametru anotēšana: Anotācijas, kas tiek piemērotas galvenā konstruktora parametriem, anotē šos parametrus. Tam tiek izmantots
@param:. - Funkciju un metožu parametru anotēšana: Anotācijas tiek piemērotas tieši pirms parametra.
- Reflection darbība ar anotācijām: Kotlin reflection (katalogs
kotlin-reflect) ļauj iegūt informāciju par anotācijām run-time, ja tiek izmantots@Retention(AnnotationRetention.RUNTIME). - Lietojuma joma: Anotācijas var būt ar mērķa deklarāciju, izmantojot prefiksus:
@file:- failam@property:- īpašībai@field:- laukam, kas ģenerēts īpašībai@get:- getter'iem@set:- setter'iem@param:- konstruktoru parametriem@setparam:- īpašības setter parametriem@delegate:- deleģēšanas laukam@use-site:- lietošanas vietai, kad ir grūti precīzi norādīt mērķi
Piemērs anotācijas izveidei un lietošanai:
// Anotācijas definīcija
@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation(val value: String)
// Anotācijas lietošana
@MyAnnotation("Hello")
class MyClass {
@get:MyAnnotation("World")
val myProperty: String = "kāda vērtība"
constructor(@param:MyAnnotation("ConstructorParam") param: Int) {
// ...
}
fun myFunction(@MyAnnotation("FunctionParam") param: String) {
// ...
}
}