Anotasiyalar mexanizminin əsas faydası, JDK-da artıq hazır olan standart anotasiyaları istifadə etməkdə deyil. Lakin, öz anotasiya yaratmağa ehtiyac nadir hallarda yaranır. Məsələn, əgər biz böyük bir sistem hazırlayırıqsa və ya ayrıca bir kitabxana ayrılırıqsa, öz anotasiya yaratmağın arxitektura səviyyəsində mütləq faydası olacaq.
Gəl, bir anotasiya yaradaq.
Bunun üçün fayl yaradırıq və class və ya interface yerinə @interface yazırıq. Bu da bizim anotasiya faylımız olacaq. Daxili strukturuna baxanda anotasiya interfeysə bənzəyir.
public @interface Sum {
int sum() default 0;
}
@interface bunun anotasiya olduğunu göstərir,
default isə, parametrin standart olaraq müəyyən edilmiş bir dəyəri qaytaracağını bildirir.
Biz anotasiya yaratdıq və nəzəri olaraq artıq istifadə edə bilərik, amma əvvəlcə onun konfiqurasiyası ilə məşğul olsaq yaxşıdır.
Məsələ burasındadır ki, konfiqurasiyasız anotasiya hər hansı bir şeyə (klasslara, metodlara, atributlara və s.) tətbiq oluna bilər və ona görə də istifadə etmək xüsusi mənaya malik deyil. Nə qədər qəribə də olsa, anotasiyamızı başqa anotasiyalarla qeyd etməliyik!
Başlayaq @Target ilə.
@Target anotasiyası (Java 1.5-dən etibarlıdır) konfiqurasiya olunan anotasiyanın tətbiq imkanlarını məhdudlaşdırır. Məhdudiyyəti müəyyən bir səviyyəyə qədər gətirmək üçün @Target anotasiyasına hansı növlər üçün tətbiq oluna biləcəyini göstərən parametr ötürməliyik. Ən çox istifadə olunan növlərdən bəziləri:
@Target(ElementType.PACKAGE) | paketlər üçün |
@Target(ElementType.TYPE) | klasslar üçün |
@Target(ElementType.CONSTRUCTOR) | konstruktorlar üçün |
@Target(ElementType.METHOD) | metodlar üçün |
@Target(ElementType.FIELD) | klassın atributları (dəyişənləri) üçün |
@Target(ElementType.PARAMETER) | metod parametrləri üçün |
@Target(ElementType.LOCAL_VARIABLE) | lokal dəyişənlər üçün |
Bircə neçə tipli anotasiya lazım olsa, birdən çox parametri massiv kimi ötürə bilərik:
@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })
Konfiqurasiyanın növbəti vacib elementi - @Retention anotasiyasıdır.
Bu anotasiya, anotasiyamızın kodun hansı həyat dövründə əlçatan olacağını göstərəcək:
RetentionPolicy.SOURCE | SOURCE saxlama siyasəti ilə annotasiya edilmiş anotasiyalar icra zamanı atılır. |
RetentionPolicy.CLASS | CLASS saxlama siyasəti ilə annotasiya edilmiş anotasiyalar .class faylına yazılır, amma icra zamanı silinir. |
RetentionPolicy.RUNTIME | RUNTIME saxlama siyasəti ilə annotasiya edilmiş anotasiyalar icra vaxtı qorunur və proqramımız icra vaxtı ərzində onlara müraciət oluna bilər. |
Konfiqurasiya üçün daha bir neçə anotasiyadan da istifadə edilə bilər:
Anotasiya | Məna |
---|---|
@Inherited | Nəvazirkarlıq sinfinə valideyn sinfinin anotasiyalarını miras almağa imkan verir. |
@Documented | Anotasiya javadoc tərəfindən yaradılan sənədlərə yerləşdiriləcəkdir. |
İndi isə, öz anotasiya yaratmağa çalışaq.
Klassları və metodları annotasiya edəcək və yazılmış kodun müəllifi və versiyası haqqında məlumat saxlayacaq anotasiya yaradaq:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
String author() default "Author";
String version() default "0.0";
}
Anotasiyamızı metodlara və klasslara tətbiq edə bilərik. Anotasiyamızın metadataları proqramın icra mərhələsində əlçatan olacaq. Anotasiyamızın parametrlərinə diqqət edin. Biz iki parametr daxil edə bilərik: ad və versiya, amma daxil etməsək, göstərdiyimiz standart dəyərlər istifadə olunacaq (default "Author" və default "0.0").
Qeyd etməyə dəyər ki, parametrlər üçün standart dəyəri də göstərə bilərik. Bu halda bu parametrin göstərilməsi vacibli olur.
Parametrləri ötürərkən, value = "value" vasitəsilə keçirdiyimiz parametri mütləq göstərməliyik. Aydın şəkildə göstərmək hər zaman məcburi, hətta anotasiyamızın yeganə parametri olsa belə.
Anotasiyamızı bir neçə klassa tətbiq edirik:
@Info
public class MyClass1 {
@Info
public void myClassMethod() {}
}
@Info(version = "2.0")
public class MyClass2 {
@Info(author = "Anonymous")
public void myClassMethod() {}
}
@Info(author = "Anonymous", version = "2.0")
public class MyClass3 {
@Info(author = "Anonymous", version = "4.0")
public void myClassMethod() {}
}
GO TO FULL VERSION