Skip to end of metadata
Go to start of metadata

A nagy sikerre való tekintettel az enum típus bemutatása után következzenek az annotációk, amelyek a generics mellett Java 5 egyik legfontosabb újdonságai. A developer.com körüljárta a témát egészen részletesen M. M. Islam Christy cikkében.
Az annotációk lényege, hogy a kódot könnyebben karbantarthatóvá, illetve hibatűrőbbé tehetjük. Annotációt tudunk tenni osztályokra, konstruktorra, metódusokra illetve akár változókra, mezőkre. Annotációkat használ a JPA (Java Persistence API) is, illetve sok egyéb programkönyvtár: így működik a Swing Application Framework databinding része. Az annotáció tehát jelez valamit a fordító vagy az egyéb keretrendszerek számára, felfoghatjuk a gépnek szóló kommentként is.

Az annotációk többféle célt szolgálnak. Leggyakrabban a marker jellegű annotációkat használjuk, amelyek jeleznek valamit, ezek közül is a Java által lefoglalt annotációkat:

  • Override, amely lényege, hogy a megjelölt metódus mindenképpen felül kell írja az ősosztály azonos metódusát, különben fordításkor hibát kapunk

  • Deprecated, amely jelzi, hogy a mögötte lévő metódus elavult, idővel kikerül a használt osztályból
  • Suppresswarnings, amely hatására az előző kettő fordításkori hibaüzenet elnyelődik

Saját annotációkat is tudunk írni, amelyeknek különféle feladatokat adhatunk, a legegyszerűbb annotáció az alábbi:

SimpleAnnotation.java
public @interface SimpleAnnotation
{
}

De ennek szinte semmi értelme nincs. Az annotációk egyfajta osztályként viselkednek, tehát lehet nekünk metódusuk, amely valamit csinálhat:

SimpleAnnotation.java
public @interface SimpleAnnotation
{
  String givenValue();
}

Ezt fel tudjuk használni egy metódus annotálására, amely során semmi sem fog történni, de képesek leszünk elérni az átadott értéket, ha szükségünk van rá:

Java forrás
@SimpleAnnotation (givenValue="Hello World!")
public void doThis()
{
  System.out.println("Do this!");
}

Ha több paramétert adunk meg, akkor azokat vesszővel tudjuk elválasztani az annotáció neve után megadva. Ha egy saját annotációt nem az összes típushoz használnánk, akkor korlátozni tudjuk annak használhatósági körét a @Target annotációval, amely az annotáció annotációja:

  • @Target(ElementType.TYPE) - bármilyen eleme az osztálynak
  • @Target(ElementType.FIELD) - mező vagy változó
  • @Target(ElementType.METHOD) - metódus
  • @Target(ElementType.PARAMETER) - metódus paramétere
  • @Target(ElementType.CONSTRUCTOR) - konstruktor
  • @Target(ElementType.LOCAL_VARIABLE) - helyi változó
  • @Target(ElementType.ANNOTATION_TYPE) - annotáció annotációja
      
      
Page viewed times

8 Comments

  1. Auth Gábor AUTHOR

    Itt az újabb csámcsognivaló... :)

    Ki mit tud hozzátenni az annotációkhoz? :)

    1. Unknown User (frimen)

      Én most kivételesen csak egy rosszat mondok... azon túl, hogy vannak benne látszólag kifejezetten jó dolgok, amik már hiányoztak, csak egy bajom van vele.. nevezetesen, hogy bizonyos részében adtak a szarnak egy pofont. Ami a problémám:

      @Inherited  
        public @interface myParentObject {  
           boolean isInherited() default true;  
           String doSomething() default "Do what?";  
        }  
        
        @myParentObject  
        public Class myChildObject { }

      Ez szép és jó, tetszene is, ha ugy oldották volna meg (vagy megoldanák már végre más módon), hogy "old" stílusú interface-kre is lehessen ilyet használni, és visszafelé kompatibilisek lennének. Nem használhatom ezt:

      public Class myChildObject implements myParentObject ..

      sem ezt:

      public Class myChildObject implements @myParentObject ..

      Nem használhatom továbbra sem ezt a módszert "old" interfecekre (tudom, hogy a fönti nem kifejezetten inetface) például a MouseListener-re, arra továbbra is a implements-et kell használnom, és az összes metodusát "felülírnom" a kódban.

      Szóval ezt a részét én már megint csak fikázni tudom!

  2. @SuppressWarnings - számtalanszor tette széppé a projektemet (azzal hogy eltüntek a kicsi felkiáltójelek az Eclipseben :) )

    Igazából akkortól lesznek jók valamire, amikor bevezetik a @Null @NotNull stb. fordítást felügyelő annotációkat.

  3. Lehet még használni annotációkat arra is hogy teszt metódusokat kijelöljünk JUnit 4-ben. Form-oknál bean-eket lehet annotálni, hogy melyik érték kötelező, mi a formátuma, elfogadott értékkészlete, stb. Pár keretrendszer már használja.

    Frimen: miért akarsz annotációt implementálni? Kiterjeszteni valóban nem lehet, az talán gáz lehet bizonyos szituációkban. Az annotáció csak arra van, hogy tulajdonságokkal lehessen felruházni osztályokat, metódusokat.

    1. Unknown User (frimen)

      Az annotáció csak arra van, hogy tulajdonságokkal lehessen felruházni osztályokat, metódusokat.

      Részben igazad van.. de ugye a lenti kod hasonlóképp müködik, mint egy interface, nem kell az adott class-ban
      definiálnod az annotació metodusait.

      miért akarsz annotációt implementálni? Kiterjeszteni valóban nem lehet, az talán gáz lehet bizonyos szituációkban.

      Nem akarok, de rühellem a mostani szigorú megkötést, hogy ha implementász egy interface-t akkor minden metodisát
      bele kell irnod a class-ba, ami rendjén is van mert nincs default visszatérő érték mint az annotációknál.
      Ezért irtam, hogy szivesebben láttam volna egy olyan megvalósitást, ami a interface-k-nél is nyujtja amit az annotacio.
      Pl: MouseListener a maga 5 metódusával.. mikor Neked csak monjuk 1 kell.

    2. A JUnit-tal kapcsolatban rosszat linkeltem be.
      Ezt akartam: http://www.junit.org/junit/javadoc/4.3/org/junit/Test.html

  4. Anonymous

    Mondjuk azt is lelehetne írni, hogy hogyan tudjuk ezeket az anotaciokat feldolgozni. Ez a legfontosabb dolog! Mert saját annotációt csínalthátunk de mi értelme ha semmire se használjuk (smile). Ha senki nem írja meg, hogy lehetne akkor ha lesz idom beírom a fórumba (smile)

    1. Auth Gábor AUTHOR

      Ha cikket írnál, írj egy emailt és adok jogot.

#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))