Java Ek Açıklamalarını Anlama – Java @annotations Eğitimi
Yayınlanan: 2019-10-22
Ek Açıklamalar Java'da nasıl ve nerede kullanılır?
Java bilgisayar programlama dilinde bir açıklama, Java kaynak koduna eklenebilen özel bir sözdizimsel meta veri biçimidir.
Sınıflar, yöntemler, değişkenler, parametreler ve paketler açıklamalı olabilir. Javadoc etiketlerinden farklı olarak, Java ek açıklamaları, derleyici tarafından oluşturulan sınıf dosyalarına gömülebilmeleri ve çalışma zamanında geri alınabilir hale getirilmek üzere Java VM tarafından saklanabilmeleri açısından yansıtıcı olabilir.
Java'da mevcut olanlardan meta açıklamalar oluşturmak mümkündür, bu da bu kavramı daha karmaşık hale getirir.
Java, dilde yerleşik olarak bulunan bir dizi ek açıklama tanımlar.

Java koduna uygulanan ek açıklamalar:
- @Override – Fonksiyonun bir geçersiz kılma olup olmadığını kontrol eder. İşlev üst sınıflardan birinde bulunamazsa derleme uyarısına neden olur.
- @Deprecated – İşlevi eski olarak işaretler. İşlev kullanılırsa derleme uyarısına neden olur.
- @SuppressWarnings – Derleyiciye, açıklama parametrelerinde belirtilen derleme zamanı uyarılarını bastırması talimatını verir.
Diğer ek açıklamalara uygulanan ek açıklamalar:
- @Retention – İşaretlenen ek açıklamanın nasıl depolanacağını belirtir—Yalnızca kodda, sınıfta derlenmiş veya çalışma zamanında yansıma yoluyla kullanılabilir.
- @Documented – Belgelere eklenmek üzere başka bir notu işaretler.
- @Target - Açıklamanın ne tür Java öğelerine uygulanabileceğini kısıtlamak için başka bir açıklamayı işaretler.
- @Inherited – Açıklamalı sınıfın alt sınıflarına miras alınacak başka bir açıklamayı işaretler (varsayılan olarak açıklamalar alt sınıflara miras alınmaz).
Örnek Örnekler aracılığıyla bunlara bir göz atalım:
1) @Override Açıklama:
Varlığı, derleyiciye açıklamalı yöntemin mevcut bir üst sınıf yöntemini geçersiz kılması gerektiğini gösterir.
@Override için en yaygın kullanım durumu Object yöntemleridir:
1 2 3 4 |
@ Override public int hashValue ( ) { System . out . Println ( "This method is using @Override Annotation" ) ; } |
@Override'ın yaratılmasının ana nedeni, basit yazım hatalarıyla uğraşmaktı.
Örneğin, yanlışlıkla olarak bildirilen bir yöntem
1 |
public int hashvalue ( ) { . . . } |
aslında bir geçersiz kılma değildir – yöntem adının tamamı küçük harflere sahiptir, bu nedenle hashValue() yönteminin adıyla tam olarak eşleşmez. Ancak mükemmel bir şekilde derlenecektir. Böyle bir hatanın yapılması kolay ve yakalanması zordur ki bu tehlikeli bir kombinasyondur. @Override ek açıklamasını kullanmak, bu tür hatalar yapmanızı engeller.
Bir üst sınıf yöntemini geçersiz kıldığınızda @Override kullanma alışkanlığınız olmalıdır.

2) @Kullanımdan Kaldırılan Ek Açıklama:
Bu açıklama, işaretli öğenin kullanımdan kaldırıldığını ve artık kullanılmaması gerektiğini belirtir. Derleyici, bir program @Deprecated
ek açıklamasına sahip bir yöntem, sınıf veya alan kullandığında bir uyarı oluşturur.
Bir öğe kullanımdan kaldırıldığında, aşağıdaki örnekte gösterildiği gibi Javadoc @deprecated
etiketi kullanılarak da belgelenmelidir.
1 2 3 4 |
< strong > @ Deprecated < / strong > static void deprecatedMethod ( ) { System . out . Println ( "This method is Deprecated.." ) ; } |
3) @SuppressWarnings Açıklaması:
Derleyiciye söyle, lütfen bağırma. Ne yaptığımı biliyorum .
1 2 3 4 |
@ SuppressWarnings ( "serial" ) public class OldCode implements Serializable { System . out . Println ( "This is Old Code.." ) ; } |
4) @Saklama Açıklaması:
Saklama notu, bu türdeki notların nerede ve ne kadar süreyle tutulacağını gösterir.
Üç değer vardır:
- RetentionPolicy.SOURCE —Bu türdeki açıklamalar yalnızca kaynak düzeyinde tutulacak ve derleyici tarafından yok sayılacaktır.
- RetentionPolicy.CLASS —Bu türdeki açıklamalar, derleme zamanında derleyici tarafından tutulacak, ancak sanal makine tarafından yoksayılacak.
- RetentionPolicy.RUNTIME —Bu türdeki ek açıklamalar, yalnızca çalışma zamanında okunabilmeleri için sanal makine tarafından tutulacaktır.
1 2 3 4 |
@ Retention ( RetentionPolicy . RUNTIME ) public @ interface Crunchify_Retention { String returnSomething ( ) ; } |
5) @Belgelenmiş Açıklama:
1 2 3 4 |
@ Documented public @ interface Crunchify_Documented { String writeDocument ( ) ; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class DocumentedAnnotations { public static void main ( String arg [ ] ) { new DocumentedAnnotations ( ) . performRetention ( ) ; new DocumentedAnnotations ( ) . performDocumented ( ) ; } @ Crunchify_Retention ( returnSomething = "Hello retention test" ) public void performRetention ( ) { System . out . printf ( "Testing annotation 'Crunchify_Retention'" ) ; } @ Crunchify_Documented ( writeDocument = "Hello document" ) public void performDocumented ( ) { System . out . printf ( "Testing annotation 'Crunchify_Documented'" ) ; } } |
Şimdi Java Doc komutunu çalıştırmayı deneyin ve çıktıyı görün.

6) @Target Açıklaması:
Hedef, açıklamalı açıklama türünün örnekleri kullanılarak hangi program öğelerinin açıklama eklenebileceğini belirtir. Target değeri, java.lang.annotation.ElementType
enum üyelerinden biridir:
- ANNOTATION_TYPE. Açıklamalı açıklama türü, açıklama türü bildirimine açıklama eklemek için kullanılabilir.
- İNŞAATÇI. Açıklamalı açıklama türü, yapıcı bildirimine açıklama eklemek için kullanılabilir.
- ALAN. Açıklamalı açıklama türü, alan bildirimine açıklama eklemek için kullanılabilir.
- YEREL DEĞİŞKEN. Açıklamalı açıklama türü, yerel değişken bildirimine açıklama eklemek için kullanılabilir.
- YÖNTEM. Açıklamalı açıklama türü, yöntem bildirimine açıklama eklemek için kullanılabilir.
- PAKET. Açıklamalı açıklama türü, paket bildirimlerine açıklama eklemek için kullanılabilir.
- PARAMETRE. Açıklamalı açıklama türü, parametre bildirimlerine açıklama eklemek için kullanılabilir.
- TİP. Açıklamalı açıklama türü, tür bildirimlerine açıklama eklemek için kullanılabilir.
1 2 3 4 |
@ Target ( value = METHOD ) You can have multiple values in the Target annotation . @ Target ( value = { TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCAL_VARIABLE } ) |
7) @Devralınan Açıklama:
Adından da anlaşılacağı gibi, bir @Inherited
açıklama türü, açıklamalı bir türün alt sınıfları tarafından miras alınır.
1 2 3 4 5 6 7 8 9 10 |
@ Inherited @ interface ForEveryone { } @ interface JustForMe { } @ ForEveryone @ JustForMe class Superclass { } class Subclass extends Superclass { } |
Bu örnekte, Superclass
, hem @ForEveryone
hem de @JustForMe
ile açıkça açıklanmıştır. Subclass
açıkça ikisinden biri ile işaretlenmemiş; ancak, @ForEveryone
devralır, çünkü ikincisi @Inherited
ile açıklamalıdır.
@JustForMe
açıklamalı değildir, bu nedenle Subclass
tarafından miras alınmaz.
İşte bir sınıf düzeyinde ek açıklamalar
