2005 yılında, Java 5'in gelişiyle, ek açıklamalar adı verilen yeni varlıkları tanımaya başladık.

Ek açıklamalar, kodda bildirilebilen özel bir sözdizimsel meta veri biçimidir. Derleme sırasında veya çalışma zamanında kodu analiz etmek için kullanılırlar. Ek açıklamayı bir etiket, etiket veya derleyici ipucu olarak düşünebilirsiniz.

Muhtemelen daha önce notlarla karşılaşmışsınızdır. Örneğin, üst sınıfın bir yöntemini geçersiz kılarken, yöntemin kendisinden önce @Override yazarız. Bu ek açıklama, ebeveyn yönteminin alt sınıfta geçersiz kılınacağını gösterir.

Sözdizimi:


@Override
public int hashCode() {
      return super.hashCode();
}

Ek açıklamaların yalnızca yöntemler için geçerli olmadığını hemen not etmek istiyorum. Paketler, sınıflar, yöntemler, alanlar ve parametrelerle birlikte kullanılırlar.

Ek açıklamaların nasıl çalıştığını anlamak için önce işaretçi arabirimi kavramını tanıyalım. Java'nın ortaya çıkışından bu yana, geliştiriciler, üzerinde belirli eylemleri gerçekleştirmek için sınıfları işaretlemek için her zaman bir yola ihtiyaç duymuşlardır.

Java 5'ten önce, arabirimlerin yapmasını beklediğimiz şeyi yapmayan bir arabirim kullanıyorlardı. Yöntemi ve sözleşmesi yoktu. Bir sınıfı bir şekilde özel olarak işaretledi.

Böyle bir arayüze işaretleyici arayüz adı verildi. Adından, amacının JVM, derleyici veya bazı kitaplıklar için sınıfları işaretlemek olduğunu tahmin edebilirsiniz. Serializable gibi bazı işaretçi arabirimleri kalır. Bu işaretçi arabirimi, bir sınıfın örneklerinin serileştirilebileceğini belirtmemizi sağlar.

Gördüğümüz gibi, işaretçi arayüzleri ek açıklamaların sunulmasından sonra bile yaşamaya devam ediyor.

Ek açıklamalar ve işaretçi arayüzleri:


@MyAnnotation
public class MyClass {}

public class MyClass implements MarkerInterface {}

Her iki yaklaşım da aynı amaca sahiptir, ancak bunların uygulanmasında açık bir fark vardır. Örneğin, bir arayüzü ve bir sınıfın belirli bir türe ait olduğunu gösteren bir ek açıklamayı düşünün.

Bir arayüz kullanıyorsak, sınıfı işaretliyoruz. Yanlış kullanırsak ve bir hata oluşursa, derleme sırasında sorunu keşfederiz ve program çalışmaz.

Ek açıklamalarla her şey o kadar basit değil: burada hata çalışma zamanında algılanacak, bu da programın başlayacağı, ancak şaşırtıcı olmayan bir şekilde bitmeyeceği anlamına geliyor.

Gelecekte kullanmak için bir sınıfı işaretlememiz gerekirse, örneklerinin belirli bir yönteme iletilmesi gerektiğini unutmayın:


public class MyInteger implements Sum {}
interface Sum {};

public static void main(String[] args) throws IOException {
        increase(new MyInteger());
}
 
public static void increase(Sum count) {
        // TODO
}

Bir işaretleyici arabirimi en iyi burada çalışır.

Açıklamaların desteklediği parametreler gibi daha fazlasına ihtiyacımız olduğunda açıklamaları kullanmak en iyisidir.

JDK'daki standart ek açıklamalara bakalım:

Dipnot Tanım Örnek
@geçersiz kıl Bir yöntemin bir üst sınıfın yöntemini geçersiz kıldığını veya soyut bir sınıfın veya arayüzün bir yöntemini uyguladığını belirtir.

@Override
public int hashCode() {
        return super.hashCode();
}
@Kullanımdan kaldırıldı Kodu kullanımdan kaldırıldı olarak işaretler.

@Deprecated
public abstract void method();
@SuppressWarnings Açıklamalı öğe için derleyici uyarılarını devre dışı bırakır. Birden fazla uyarı kategorisini devre dışı bırakmanız gerekiyorsa, bunların kaşlı ayraçlar içine alınması gerektiğini unutmayın, örneğin @SuppressWarnings({"unchecked", "cast"}) .

public class DocumentsFolder {
   private List documents;

   @SuppressWarnings("unchecked")
public void addDocument(String document) {
            documents.add(document);
   }
}

Bu örnekte, tanımlı bir türü olmayan (genel bir tür) bir listeye ekleme yapmaya çalışıyoruz. Derleyici bizi bu konuda uyaracaktır. Bu çok kullanışlıdır, ancak bazen çok fazla "uyarı" vardır ve bunlar gürültülü olabilir. Bu yöntem ek açıklamasını kullanabilir ve bağımsız değişken olarak bir derleyici uyarısı türü belirtebilirsiniz. Pek çok işaretçi var, bu yüzden hepsini hatırlama konusunda endişelenmeyin — IDEA genellikle hangisini ekleyeceğinizi size söyler.

Birden fazla argüman içeren başka bir örnek:


@SuppressWarnings({"unchecked", "deprecated"})