Sobes.tech
Junior

Kako koristiti anotacije u Kotlinu?

sobes.tech АИ

Одговор од АИ

Anotacije u Kotlin-u se koriste za dodavanje meta-informacija klasama, svojstvima, funkcijama, izrazima i parametrima. One ne izvršavaju direktnu akciju, ali mogu biti korišćene od strane kompajlera, okvira ili drugih biblioteka za razne obrade.

Glavni aspekti korišćenja:

  1. Sintaksa: Anotacije se navode pre elementa na koji se primenjuju, u uglastim zagradama @. Ako anotacija ima parametre, oni se navode u zagradama nakon imena.

    @Deprecated("Use newFunction instead")
    fun oldFunction() {
        // ...
    }
    
    @JvmStatic
    fun staticMethod() {
        // ...
    }
    
  2. Primena na različite elemente: Anotacije se mogu primenjivati na:

    • Klase (class):
      @Serializable
      class User(val name: String)
      
    • Svojstva (val, var):
      @Inject
      lateinit var userRepository: UserRepository
      
    • Funkcije (fun):
      @Test
      fun testSomething() {
          // ...
      }
      
    • Parametre konstruktora/funkcija:
      fun processUser(@NotNull user: User) {
          // ...
      }
      
    • Izraze:
      fun calculate(@Ignore parameter: Int) {
          // ...
      }
      
    • Tipove (@Target(AnnotationTarget.TYPE)):
      val list: @NotNull List<String> = emptyList()
      
  3. Mesta primene (Use-site Targets): Za disambiguaciju toga na kojem elementu se primenjuje anotacija, kada ih ima više (npr. polje i getter), koriste se use-site targets.

    Target Opis
    @file: Primjenjuje se na cijeli fajl
    @property: Primjenjuje se na cijelu svojstvo
    @field: Primjenjuje se na backing field
    @get: Primjenjuje se na getter svojstva
    @set: Primjenjuje se na setter svojstva
    @param: Primjenjuje se na parametar konstruktora ili funkcije
    @setparam: Primjenjuje se na parametar seta
    @delegate: Primjenjuje se na instancu delegirane svojstva
    @receiver: Primjenjuje se na tip primaoca
    class Example(@field:Inject val dependency: Dependency) {
        // @field:Inject se primjenjuje na polje 'dependency'
    }
    
  4. Definisanje sopstvenih anotacija: Sopstvene anotacije se definišu ključnom reči annotation class. Parametri anotacije mogu biti primitivni tipovi, stringovi, klase (KClass), enumi, druge anotacije ili nizovi ovih tipova.

    annotation class MyAnnotation(val value: String, val count: Int = 0)
    
    @MyAnnotation("Hello", count = 5)
    class AnnotatedClass {
        // ...
    }
    
  5. Meta-anotacije: Anotacije mogu biti označene meta-anotacijama koje definišu njihovo ponašanje i primenjivost.

    • @Target: Navodi koje elemente mogu anotirati.
    • @Retention: Navodi u kojoj fazi životnog ciklusa anotacija postoji (SOURCE, BINARY, RUNTIME).
    • @Repeatable: Omogućava primenu anotacije više puta na isti element.
    • @MustBeDocumented: Navodi da anotacija treba biti deo javnog API-ja koji generišu alati za dokumentaciju.
    @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProcessedByFramework
    

Anotacije se široko koriste u Kotlinu za integraciju sa JVM okvirima (Spring, Android), serializaciju (Kotlinx.serialization), testiranje (JUnit) i kreiranje sopstvenih biblioteka zasnovanih na meta-informacijama.