A megjegyzések fő előnye nem a JDK-ban már megtalálható szabványos megjegyzések használatából fakad. Ugyanakkor ritkán van szükség saját megjegyzés létrehozására. De ha nagy rendszert fejlesztünk, vagy külön könyvtárat hozunk létre, akkor építészeti szinten a saját annotációnk megvalósítása mindenképpen meghozza a gyümölcsét.

Próbáljunk meg egy annotációt létrehozni.

Ehhez hozzon létre egy fájlt, de osztály vagy felület írása helyett írjon @interface . Ez lesz a megjegyzésünk fájlja. Az annotáció belső szerkezete hasonló az interfészéhez.

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

Az @interface azt jelzi, hogy ez egy megjegyzés,
az alapértelmezett pedig azt, hogy a paraméternek egy meghatározott alapértelmezett értéke lesz.

Ta-da! Létrehoztunk egy kommentárt! Elméletileg már használhatjuk, de előbb jobb lenne beállítani.

Konfiguráció nélkül az annotációnk bármire alkalmazható (osztályokra, metódusokra, attribútumokra stb.), ezért nincs értelme jelenleg használni. Bármilyen furcsának is tűnik, a jegyzetünket más megjegyzésekkel kell ellátni!

Kezdjük a @Target-el .

A @Target annotáció (a Java 1.5 óta releváns) korlátozza a megjegyzés alkalmazásának lehetőségét. A használat egy bizonyos szintre való korlátozásához egy argumentumot kell átadnunk a @Target annotációnak, jelezve, hogy mely típusokra alkalmazható. Íme néhány a leggyakrabban használt típusok közül:

@Target(ElemTípus.CSOMAG) csomagokhoz
@Target(Elemtípus.TYPE) osztályok számára
@Cél(Elemtípus.CONSTRUCTOR) kivitelezőknek
@Target(Elemtípus.METÓD) módszerekhez
@Cél(Elemtípus.FIELD) osztály attribútumaihoz (változóihoz).
@Target(Elemtípus.PARAMATER) a metódus paramétereihez
@Target(Elemtípus.LOCAL_VARIABLE) a helyi változókhoz

Ha több típushoz van szüksége annotációra, akkor több argumentumot is átadhat tömbként:

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

A konfiguráció következő fontos része a @Retention megjegyzés.

Ez a megjegyzés jelzi a kód életciklusának azon részeit, amelyekben a kommentárunk elérhető lesz:

RetentionPolicy.FORRÁS A SOURCE megőrzési szabályzattal megjelölt megjegyzéseket a rendszer futási időben elveti.
RetentionPolicy.CLASS Az OSZTÁLY megőrzési szabályzattal megjelölt megjegyzések a .class fájlba kerülnek , de futás közben eltávolítják őket.
RetentionPolicy.RUNTIME A RUNTIME megőrzési szabályzattal megjelölt megjegyzések futás közben is megmaradnak, és futási időben elérhetők a programunkban.

Van néhány további megjegyzés, amelyet a konfigurációhoz használhat:

Annotáció Érték
@Örökölt Azt jelzi, hogy egy származtatott osztály örökli a megjegyzés szülőosztályának megvalósítását.
@Dokumentált Ez azt jelzi, hogy a megjegyzés szerepelni fog a generált Javadoc dokumentációban.

Most próbáljuk meg létrehozni a saját kommentárunkat.

Létrehozunk egy megjegyzést, amely osztályokhoz és metódusokhoz szól, és információkat tartalmaz a kód szerzőjéről és verziójáról:

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

Annotációnkat metódusokra és osztályokra is alkalmazhatjuk. A kommentárunk metaadatai futási időben lesznek elérhetők. Ügyeljen az annotációnk paramétereire: Két argumentumot (szerző és verzió) adhatunk meg, vagy elhagyhatjuk őket. Ha ezeket elhagyjuk, akkor a megadott alapértelmezett értékek ( alapértelmezett "Szerző" és alapértelmezett "0.0" ) kerülnek felhasználásra.

Érdemes megjegyezni, hogy a paraméterekhez nem kell alapértelmezett értéket megadnunk. Ebben az esetben a paraméter kötelezővé válik.

Az argumentumok átadásakor meg kell adnunk a megfelelő paramétert a value = "value" jelöléssel . A paramétert mindig kifejezetten meg kell nevezni, még akkor is, ha a megjegyzés egyetlen paraméterrel rendelkezik.

Alkalmazzuk megjegyzésünket néhány osztályra:

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