Sobes.tech
Middle

Kotlin-ში ანოტაციებთან მუშაობის მახასიათებლები რა არის?

sobes.tech AI

პასუხი AI-სგან

კოტლინში ანოტაციები მსგავსია ჯავას ანოტაციებთან, მაგრამ მათ აქვთ რიგი თავისებურებები:

  • სინტაქსი: ანოტაციები დებენ იმ ელემენტის წინ, რომელსაც ეხება, @ სიმბოლის გარეშე.
  • გამოყენება 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")
კლასი MyClass {

    @get:MyAnnotation("World")
    val myProperty: String = "მნიშვნელობა"

    კონსტრუქტორი(@param:MyAnnotation("ConstructorParam") param: Int) {
        // ...
    }

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