Annotations ( Anotasyonlar)-1 Custom Annotation
Anotasyonların amacı; sınıflara, yöntemlere, değişkenlere ve diğer Java türlerine meta data özniteliklerini atamaktır. Anotasyonlar aslında bir interface gibi işlev görürler. Arayüzler sadece sınıflara uygulanabilirken, anotasyonlar sınıflara, yöntemlere uygulanabilirler. Anotasyonlar isteğe bağlı meta datalardır ve kendi başlarına bir şey ifade etmezler. Bir anotasyon bir sınıftan kaldırılabilir ve yine de derlenir, bunun tersi doğru değildir. Bir anotasyon eklemek derleyici hatasına sebebiyet verebilir. Uygulamanızda kendi anotasyonunuzu oluşturulabilir, javaya özgü özel anotasyonları kullanabilirsiniz.
Custom Annotation
Kendinize özel custom anotasyonlar oluşturmak çok kolaydır. Bunun için @interface anotasyonu kullanılır. Evet, bir anotasyon oluşturmak için @interface anotasyonu kullanılmaktadır. Aşağıda örnek olarak Test isimli bir anotasyon oluşturulmuştur.
public @interface Test {}
Artık oluşturduğumuz anotasyonu @Test ifadesi ile sınıflarımızda, metotlarımızda kullanabiliriz:
@Test public class Alfa {}
Bir sınıf birden fazla anotasyon uygulanabilir:
@Test @Test2 public class Alfa {}
Bir anatosyon ögesi, bir anotasyonun kullanımıyla ilgili değerleri depolayan bir özniteliktir. Şimdi @Test anotasyonunu işlevsel hale getirelim:
public @interface Test { int dakika(); }
Buradaki dakika bir abstract ( soyut) sınıfa çok benziyor, ancak durum öyle değildir. Buradaki dakika bir attribute(öznitelik)tir. Bu anotasyonu bu yeni haliyle Alfa isimli sınıfımıza eklersek;
@Test(dakika = 3) public class Alfa {}
Anotasyonlarımızı hazırlarken default bir değer set edip kullanabiliriz. Örnek olarak;
public @interface Test { int dakika(); int saniye() default 4; int saat() default 12; }
Burada bu anotasyonu bir sınıf üzerinde kullandığımızda sadece dakika özniteliğine değer set edilse dahi, saniye özniteliği default olarak 4 değerini alarak sınıfa etki edecektir. Aşağıda bu anotasyonu kullanan alfa sınıfına bakalım;
@Test(dakika = 3, saat = 7) public class Alfa {}
Yukarıdaki sınıfa etki eden Test anotasyonu dakika ve saat özniteliklerine değer atamıştır. Burada saat anotasyonundaki saat özniteliğinin değeri ezilmiş ve yeni bir değer atanmıştır. Ayrıca anotasyonun kullanımında saniye özniteliği belirtilmese dahi default anahtar kelimesi ile değer set edildiği için anotasyonun kullanımında belirtilmesinde gerek yoktur.
Bir anotasyonda bir özniteliğe verilen değer null bir değer olamaz. Aşağıdaki örneklenmiştir.
public @interface Test3 { String ad() default new String(""); //DERLENMEZ String soyad() default null; //DERLENMEZ }
Anotasyonlarda kullanılan özniteliklerin veri tipleri de önemlidir. Genellikle primitive tipte veriler kullanılıır. Integer, Long gibi wrapper class tiplere izin verilmez. Bunun dışında enum değerler de bildirilebilir. Ayrıca bir anotasyonu da aşağıdaki örnekteki gibi bildirebiliriz.
public class Beta {} public enum Hacim { KUCUK,ORTA,BUYUK } public @interface Test4 { Integer uzunluk(); //DERLENMEZ.... WRAPPER CLASS String[][] bilgi(); //DERLENMEZ.... Hacim hacim() default Hacim.KUCUK; Beta betam(); //DERLENMEZ... TIPI BETA Test test() default @Test(dakika = 12); }
Anotasyonda belirtilen öz nitelikler açık açık belirtilmese dahi public ve abstract’tır. Bunun dışındaki tanımlamalar derleyici hatasına neden olacaktır. Ayrıca abstract metotlar final ile tanımlanamayacağı için bu da derleyici hatasına sebep olacaktır.
public @interface Test5 { public abstract int genislik() default 11; protected String k(); //DERLENMEZ.... final boolean s(); //DERLENMEZ... }
Anotasyonlarda öznitelikler dışında değişkenler de bildirilebilir. Anotasyonlar da nihayetinde bir interface olduğu için, interface’lerde kullanılan değişken tanımlama kuralları ile aynıdır. Anotasyonlarda kullanılan değişkenler static ve final olmak zorundadır. Statik ve final olarak belirtilemese dahi örtük olarak statik ve final işaretlidirler.
public @interface Test6 { public int genislik(); int MIN_TOPLAM = 2; public static final int MAX_TOPLAM = 100; }