Middle
Ի՞նչ են Kotlin-ում annotations-ների հետ աշխատելու առանձնահատկությունները։
sobes.tech AI
Պատասխան AI-ից
Կոտլինում նշումները նման են Java-ի նշումներին, բայց ունեն մի շարք առանձնահատկություններ՝
- Սինտաքսիս: Նշումները դրվում են այն տարրից առաջ, որի վրա կիրառվում են, առանց
@նշանի: - Օգտագործում run-time-ում: Դեպքում, երբ նշումները չեն պահվում run-time-ում, դրանք պահելու համար անհրաժեշտ է օգտագործել
@Retention(AnnotationRetention.RUNTIME)մետա-նշումը: - Կարգի կիրառումը տիպի վրա: Նշումները կարող են կիրառվել ոչ միայն դասերի, ֆունկցիաների և հատկությունների վրա, այլ նաև տիպերի (օրինակ՝
@NonNull String)։ Դրա համար օգտագործվում էtypealias: - Կոնստրուկտորի նշում: Հիմնական կոնստրուկտորի նշման համար օգտագործվում է
constructorբանալի բառը։ Երկրորդական կոնստրուկտորների համար նշումը դրվում է անմիջապես նրանց առաջ: - Նշում հատկությունների և նրանց ակցեսորների վրա: Նշումները կարող են կիրառվել հենց հատկության վրա, նրա getter-ի (
@get:) կամ setter-ի (@set:): - Կոնստրուկտորի պարամետրերի նշում հատկությունների համար: Նշումները, որոնք կիրառվում են հիմնական կոնստրուկտորի պարամետրերին, որոնք միաժամանակ հանդիսանում են հատկություններ, նշում են այդ հատկությունները։ Սրա համար օգտագործվում է
@param:: - Ֆունկցիաների և մեթոդների պարամետրերի նշում: Նշումները կիրառվում են անմիջապես պարամետրից առաջ:
- Reflection-ում նշումների աշխատանքը: Kotlin reflection (կատալոգ
kotlin-reflect) թույլ է տալիս ստանալ նշումների մասին տեղեկատվություն run-time-ում, եթե օգտագործվում է@Retention(AnnotationRetention.RUNTIME): - Կիրառման ոլորտը: Նշումները կարող են ունենալ նպատակային հայտարարում՝ նախածանցների միջոցով՝
@file:- ֆայլի համար@property:- հատկության համար@field:- դաշտի համար, որը գեներացվել է հատկության համար@get:- getter-ի համար@set:- setter-ի համար@param:- կոնստրուկտորի պարամետի համար@setparam:- հատկության setter-ի պարամետի համար@delegate:- դելեգատային դաշտի համար@use-site:- օգտագործման վայրի համար, երբ նպատակն է հստակ նշել:
Նմուշ՝ նշում ստեղծելու և օգտագործելու:
// Նշման սահմանում
@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation(val value: String)
// Օգտագործում
@MyAnnotation("Hello")
class MyClass {
@get:MyAnnotation("World")
val myProperty: String = "մեկ արժեք"
constructor(@param:MyAnnotation("ConstructorParam") param: Int) {
// ...
}
fun myFunction(@MyAnnotation("FunctionParam") param: String) {
// ...
}
}