Sobes.tech
Middle

Jakie są cechy pracy z adnotacjami w Kotlin?

sobes.tech AI

Odpowiedź od AI

Adnotacje w Kotlinie są podobne do adnotacji w Javie, ale mają kilka cech:

  • Składnia: Adnotacje umieszcza się przed elementem, do którego się odnoszą, bez symbolu @.
  • Użycie w czasie działania: Domyślnie adnotacje nie są zachowywane w czasie działania. Aby je zachować, należy użyć meta-adnotacji @Retention(AnnotationRetention.RUNTIME).
  • Zastosowanie do typu: Adnotacje można stosować nie tylko do klas, funkcji i właściwości, ale także do typów (np. @NonNull String). Do tego służy typealias.
  • Adnotacja konstruktorów: Aby oznaczyć główny konstruktor klasy, używa się słowa kluczowego constructor. Dla konstruktorów wtórnych adnotacja umieszczana jest bezpośrednio przed nimi.
  • Adnotacja właściwości i ich accessorów: Adnotacje można stosować do samej właściwości, jej getter (@get:) lub setter (@set:).
  • Adnotacja parametrów konstruktora dla właściwości: Adnotacje stosowane do parametrów głównego konstruktora, które są jednocześnie właściwościami, oznaczają te właściwości. Do oznaczenia samego parametru używa się @param:.
  • Adnotacja parametrów funkcji i metod: Adnotacje umieszczane są bezpośrednio przed parametrem.
  • Praca z adnotacjami w reflection: Reflection w Kotlinie (kotlin-reflect) pozwala na pobieranie informacji o adnotacjach w czasie działania, jeśli używa się @Retention(AnnotationRetention.RUNTIME).
  • Zakres zastosowania: Adnotacje mogą mieć deklarację celu za pomocą prefiksów:
    • @file: - dla pliku
    • @property: - dla właściwości
    • @field: - dla pola wygenerowanego dla właściwości
    • @get: - dla getter'a właściwości
    • @set: - dla setter'a właściwości
    • @param: - dla parametru konstruktora
    • @setparam: - dla parametru setter'a właściwości
    • @delegate: - dla pola delegata
    • @use-site: - do wskazania miejsca użycia, gdy nie można jasno określić celu

Przykład tworzenia i użycia adnotacji:

// Definicja adnotacji
@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation(val value: String)

// Użycie adnotacji
@MyAnnotation("Hello")
class MyClass {

    @get:MyAnnotation("World")
    val myProperty: String = "some value"

    constructor(@param:MyAnnotation("ConstructorParam") param: Int) {
        // ...
    }

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