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