JAVA ANNOTATION
Java’da sınıf, metot, paket gibi programatik unsurlar için metadata (veri hakkında veri) oluşturmaya yarayan özelliklerdir. Bu anlamda Java öğrenen kişiler tarafından Javadoc tag’lerine benzetilmekteyse de annotation’lar “reflective” olmalarıyla yani reflection ile programatik olarak erişilebilir olmalarıyla nedeniyle farklıdır.
Bu özellik Java’ya 5 versiyonunda gelmiştir.
Annotation’lar başında @ karakteri yazılarak kullanılırlar. Bazı annotation’lar dil spesifikasyonunda ön tanımlı durumdadır ve derleyici tarafından kullanılmaktadır. Örneğin :
@Deprecated : Bu annotation ile işaretlenmiş bir eleman daha yeni bir versiyonu olduğu gerekçesiyle kullanımı önerilmeyen bir eleman anlamındadır. Kullanıldığı takdirde derleyici uyarı verir. Örneğin :
/**
* @deprecated
* açıklamalar …
*/
@Deprecated
static void DemodeMetot()
{
}Burada @deprecated bir javadoc tag’i ama @Deprecated ise bir ön tanımlı annotation’dır.
@Override : Bu annotation üzerinde yer aldığı fonksiyonun bir taban sınıftan miras alınan sanal bir fonksiyon olduğunu ve override edildiği konusunda derleyiciyi bilgilendirir.
@Override
void Foo()
{
}@SuppressWarnings : Bu annotation derleyiciye normalde bir uyarı vereceği durumda o uyarıyı vermemesini sağlar. Örneğin deprecated bir fonksiyon kullanılıp da uyarı alınmak istenmezse bu annotation ile amaca ulaşılabilir.
@SuppressWarnings("deprecation")
void Foo()
{
DemodeMetot(); //warning örtbas edilir
}Annotation’lar görüldüğü gibi parametre alabilmektedir. @SuppressWarnings buna bir örnektir. @Override ise parameter almadığı için parametre parantezi kullanılmamıştır.
Get Aykut TAŞDELEN’s stories in your inbox
Join Medium for free to get updates from this writer.
Annotation parametreleri isimlendirilmiş bir parametre ise argüman doğrudan isme atanır. Örneğin :
@Author(
name = "Aykut TAŞDELEN",
date = "17/08/1999"
)
class Test()
{
}Özgün Annotation’ların Yazılması
Özgün annotation’lar interface’ler kullanılarak geliştirilir. Örneğin
public @interface Annotation_İsmi
{
// …
}Annotation’ların bildiriminde yine başka annotation’lar kullanılmaktadır. Bunlar :
@Retention : Bu annotation geliştirilen özgün annotation’ına reflection ile çalışma zamanında erişilip erişilemeyeceğini belirlemeye yarar. Erişilsin isteniyorsa şöyle kullanılmalıdır :
@Retention (RetentionPolicy.RUNTIME)
RetentionPolicy enum’ının CLASS ve SOURCE statik sabitlerinden CLASS varsayılandır ve annotation’ının sınıfa kaydedileceğini fakat Virtual Machine tarafıdan runtime’da erişilmeyeceğini ifade eder. SOURCE ise annotation’ının görmezden gelineceğini ifade eder. ???
@Target(ElementType.TYPE) : Bu annotation ise söz konusu annotation’ının hangi eleman üzerinde kullanılabileceğini belirlemeye yarar. TYPE; sınıf, enum veya Interface üzerinde kullanılabileceğini ifade eder. ElementType enum’ının farklı sabitleriyle bu durum değiştirilebilir.
Aşağıda bir sınıfı kimin, ne zaman geliştirdiği bilgisini metadata haline getiren bir annotation örneği verilmiştir :
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Sample {
public String Developer();
public String Date();
}
Bu annotation bir sınıfın üzerinde şu şekilde kullanılmıştır :
@Sample(Developer="aykut taşdelen", Date="12.11.1999")
public class Deneme
{
// …
}İçindeki metadata bilgilerine ise runtime’da şu şekilde erişilmiştir :
import java.lang.annotation.Annotation;
public class Program
{
public static void main(String[] args)
{
Class<Deneme> cls = Deneme.class;
Annotation annotation = cls.getAnnotation(Sample.class);
if(annotation instanceof Sample){
Sample ant = (Sample) annotation;
System.out.println("Geliştirici:" + ant.Developer());
System.out.println("Tarih: " + ant.Date());
}
}
}Aykut TAŞDELEN Quantum Akademi (Kurucu & Eğitmen)
www.quantumakademi.com | info@quantumakademi.com
https://www.linkedin.com/in/aykuttasdelen/
https://www.youtube.com/channel/UCnwiTexPFiAy6b49d14e8dg
https://www.instagram.com/quantum_akademi/







