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 китепканасы) @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) {
        // ...
    }
}