Sobes.tech
Middle

Kādas ir iezīmes darbā ar anotācijām Kotlin?

sobes.tech AI

Atbilde no AI

Kotlin anotācijas ir līdzīgas Java anotācijām, bet tām ir vairākas īpatnības:

  • Sintakse: Anotācijas tiek novietotas pirms elementa, uz kuru tās attiecas, bez @ simbols.
  • Lietošana run-time: Pēc noklusējuma anotācijas netiek saglabātas run-time. Lai tās saglabātu, jāizmanto meta-anotācija @Retention(AnnotationRetention.RUNTIME).
  • Pielietojums tipam: Anotācijas var piemērot ne tikai klasēm, funkcijām un īpašībām, bet arī tipiem (piemēram, @NonNull String). Tam tiek izmantots typealias.
  • Konstruktora anotēšana: Galvenajam konstruktora anotēšanai tiek izmantots atslēgvārds constructor. Sekundārajiem konstruktoriem anotācija tiek novietota tieši pirms tiem.
  • Īpašību un to accessor'u anotēšana: Anotācijas var piemērot pašai īpašībai, tās getter'iem (@get:) vai setter'iem (@set:).
  • Konstruktora parametru anotēšana: Anotācijas, kas tiek piemērotas galvenā konstruktora parametriem, anotē šos parametrus. Tam tiek izmantots @param:.
  • Funkciju un metožu parametru anotēšana: Anotācijas tiek piemērotas tieši pirms parametra.
  • Reflection darbība ar anotācijām: Kotlin reflection (katalogs kotlin-reflect) ļauj iegūt informāciju par anotācijām run-time, ja tiek izmantots @Retention(AnnotationRetention.RUNTIME).
  • Lietojuma joma: Anotācijas var būt ar mērķa deklarāciju, izmantojot prefiksus:
    • @file: - failam
    • @property: - īpašībai
    • @field: - laukam, kas ģenerēts īpašībai
    • @get: - getter'iem
    • @set: - setter'iem
    • @param: - konstruktoru parametriem
    • @setparam: - īpašības setter parametriem
    • @delegate: - deleģēšanas laukam
    • @use-site: - lietošanas vietai, kad ir grūti precīzi norādīt mērķi

Piemērs anotācijas izveidei un lietošanai:

// Anotācijas definīcija
@Retention(AnnotationRetention.RUNTIME)
annotation class MyAnnotation(val value: String)

// Anotācijas lietošana
@MyAnnotation("Hello")
class MyClass {

    @get:MyAnnotation("World")
    val myProperty: String = "kāda vērtība"

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

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