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żytypealias. - 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) {
// ...
}
}