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() {}
}
GO TO FULL VERSION