Ek açıklamaların ana yararı, zaten JDK'da bulunan standart olanları kullanmaktan gelmez. Aynı zamanda, kendi ek açıklamanızı oluşturmaya nadiren ihtiyaç duyulur. Ancak, büyük bir sistem geliştiriyor veya ayrı bir kitaplık oluşturuyorsak, o zaman mimari düzeyde, kendi ek açıklamamızı uygulamak kesinlikle fayda sağlayacaktır.

Bir ek açıklama oluşturmaya çalışalım.

Bunu yapmak için bir dosya oluşturun, ancak class veya interface yazmak yerine @interface yazın . Bu, ek açıklamamız için dosya olacaktır. Ek açıklamanın iç yapısı, arabiriminkine benzer.

public @interface Sum {
   int sum() default 0;
}

@interface, bunun bir ek açıklama olduğunu belirtir,
varsayılan , parametrenin belirli bir varsayılan değere sahip olacağını söyler.

Ta-da! Bir ek açıklama oluşturduk! Teorik olarak zaten kullanabiliriz, ancak önce onu yapılandırmak daha iyi olur.

Konfigürasyon olmadan ek açıklamamız her şeye (sınıflara, yöntemlere, niteliklere vb.) uygulanabilir, bu nedenle bu noktada onu kullanmanın pek bir anlamı yoktur. Garip görünse de, açıklamamızın diğer açıklamalarla birlikte açıklanması gerekiyor!

@Target ile başlayalım .

@Target ek açıklaması (Java 1.5'ten beri geçerlidir) , ek açıklama uygulama yeteneğini kısıtlar. Kullanımı belirli bir seviyede sınırlamak için, hangi türlere uygulanabileceğini belirtmek için @Target ek açıklamasına bir argüman iletmemiz gerekir . Yaygın olarak kullanılan türlerden bazıları şunlardır:

@Target(ElementType.PACKAGE) paketler için
@Target(ElementType.TYPE) sınıflar için
@Target(ElementType.CONSTRUCTOR) inşaatçılar için
@Target(ElementType.METHOD) yöntemler için
@Target(ElementType.FIELD) bir sınıftaki nitelikler (değişkenler) için
@Target(ElementType.PARAMATER) yöntem parametreleri için
@Target(ElementType.LOCAL_VARIABLE) yerel değişkenler için

Birkaç tür için ek açıklamaya ihtiyacınız varsa, birkaç bağımsız değişkeni bir dizi olarak iletebilirsiniz:

@Target({ ElementType.PARAMETER, ElementType.LOCAL_VARIABLE })

Yapılandırmanın bir sonraki önemli kısmı, @Retention ek açıklamasıdır.

Bu açıklama, açıklamamızın mevcut olacağı kod yaşam döngüsünün bölümlerini gösterir:

RetentionPolicy.SOURCE SOURCE bekletme ilkesiyle işaretlenen ek açıklamalar çalışma zamanında atılır.
RetentionPolicy.CLASS CLASS saklama ilkesiyle işaretlenen ek açıklamalar .class dosyasına yazılır , ancak çalışma zamanında kaldırılır.
RetentionPolicy.RUNTIME RUNTIME bekletme ilkesiyle işaretlenen ek açıklamalar çalışma zamanında kalır ve çalışma zamanında programımızdan erişilebilir.

Yapılandırma için kullanabileceğiniz birkaç açıklama daha vardır:

Dipnot Değer
@Miras Türetilmiş bir sınıfın, bir üst sınıfın ek açıklama uygulamasını devraldığını gösterir.
@belgelenmiş Bu, ek açıklamanın oluşturulan Javadoc belgelerine dahil edileceğini gösterir.

Şimdi kendi ek açıklamamızı oluşturmaya çalışalım.

Sınıflar ve yöntemler için olan ve kodun yazarı ve sürümü hakkında bilgi içeren bir ek açıklama oluşturacağız:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Info {
   String author() default "Author";
   String version() default "0.0";
}

Ek açıklamamızı yöntemlere ve sınıflara uygulayabiliriz. Ek açıklamamızın meta verileri çalışma zamanında kullanılabilir olacaktır. Ek açıklamamızın parametrelerine dikkat edin: İki argüman sağlayabiliriz (yazar ve sürüm) veya bunları atlayabiliriz. Bunları atlarsak, belirtilen varsayılan değerler ( varsayılan "Yazar" ve varsayılan "0.0" ) kullanılacaktır.

Parametreler için varsayılan bir değer belirtmek zorunda olmadığımızı belirtmekte fayda var. Bu durumda, parametre zorunlu hale gelir.

Argümanları iletirken, karşılık gelen parametreyi value = "value" gösterimini kullanarak belirtmeliyiz . Ek açıklama tek bir parametreye sahip olsa bile, parametre her zaman açıkça adlandırılmalıdır.

Ek açıklamamızı birkaç sınıfa uygulayalım:

@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() {}
}