2005-ben, a Java 5 megjelenésével új entitásokat, az annotációkat ismerhettünk meg.

Az annotációk a szintaktikai metaadatok egy speciális formája, amely kódban deklarálható. Ezeket a kód elemzésére használják fordításkor vagy futás közben. A kommentárt címkének, címkének vagy fordítói tippnek tekintheti.

Valószínűleg találkoztál már megjegyzésekkel. Például a szülőosztály metódusának felülbírálásakor a @Override szót írjuk a metódus elé. Ez a megjegyzés azt jelzi, hogy a szülő metódusa felül lesz írva a gyermekosztályban.

Szintaxis:

@Override
public int hashCode() {
      return super.hashCode();
}

Azonnal szeretném megjegyezni, hogy a megjegyzések nem csak a módszerekre vonatkoznak. Csomagokkal, osztályokkal, metódusokkal, mezőkkel és paraméterekkel használhatók.

Az annotációk működésének megértéséhez először ismerkedjünk meg a marker interfész fogalmával. A Java megjelenése óta a fejlesztőknek mindig szükségük volt egy módra az osztályok megjelölésére, hogy bizonyos műveleteket hajtsanak végre rajtuk.

A Java 5 előtt olyan felületet használtak, amely nem azt csinálta, amit az interfészektől elvárunk. Nem voltak módszerei és szerződése sem. Valamilyen szempontból különlegesnek jelölt meg egy osztályt.

Az ilyen interfészt marker interfésznek nevezték. A névből sejthető, hogy célja osztályok megjelölése a JVM-hez, fordítóhoz vagy valamilyen könyvtárhoz. Néhány marker interfész, például a Serializable , megmarad. Ez a marker interfész lehetővé teszi számunkra, hogy jelezzük, hogy egy osztály példányai sorba rendezhetők.

Amint láttuk, a jelölőfelületek a megjegyzések bevezetése után is tovább élnek.

Megjegyzések és jelölőfelületek:

@MyAnnotation
public class MyClass {}
public class MyClass implements MarkerInterface {}

Mindkét megközelítés ugyanazt a célt szolgálja, de egyértelmű különbség van a megvalósításukban. Vegyünk például egy interfészt és egy megjegyzést, amely jelzi, hogy egy osztály egy adott típushoz tartozik.

Ha interfészt használunk, akkor megjelöljük az osztályt. Ha helytelenül használjuk és hiba lép fel, akkor a fordításkor felfedezzük a hibát, és a program nem fog futni.

A megjegyzésekkel minden nem ilyen egyszerű: itt a hiba futás közben észlelhető, ami azt jelenti, hogy a program elindul, de nem meglepő módon nem fejeződik be.

Vegye figyelembe, hogy ha meg kell jelölnünk egy osztályt jövőbeni használatra, akkor annak példányait át kell adni egy adott metódusnak:

public class MyInteger implements Sum {}
interface Sum {};

public static void main(String[] args) throws IOException {
        increase(new MyInteger());
}

public static void increase(Sum count) {
        // TODO
}

Itt a marker interfész működik a legjobban.

A legjobb, ha megjegyzéseket használunk, ha valami többre van szükségünk, például a megjegyzések által támogatott paraméterekre.

Nézzük a JDK szabványos megjegyzéseit:

Annotáció Leírás Példa
@Felülbírálás Megadja, hogy egy metódus felülírja egy szuperosztály metódusát, vagy egy absztrakt osztály vagy interfész metódusát valósítja meg.
@Override
public int hashCode() {
        return super.hashCode();
}
@Elavult A kódot elavultként jelöli meg.
@Deprecated
public abstract void method();
@SuppressWarnings Letiltja a fordítói figyelmeztetéseket a megjegyzésekkel ellátott elemhez. Vegye figyelembe, hogy ha több figyelmeztetési kategóriát is le kell tiltania, azokat kapcsos zárójelek közé kell tenni, például @SuppressWarnings({"unchecked", "cast"}) .
public class DocumentsFolder {
   private List documents;

   @SuppressWarnings("unchecked")
public void addDocument(String document) {
            documents.add(document);
   }
}

Ebben a példában olyan listához próbálunk hozzáadni, amelynek nincs meghatározott típusa (általános típus). A fordító figyelmeztetni fog minket erre. Ez nagyon hasznos, de néha túl sok a "figyelmeztetés", és ezek zajosak lehetnek. Használhatja ezt a metódus annotációt, és argumentumként megadhatja a fordítói figyelmeztetés típusát. Nagyon sok jelölő létezik, ezért ne aggódjon amiatt, hogy mindegyiket megjegyezze – az IDEA általában megmondja, melyiket kell hozzáadnia.

Egy másik példa több érvvel:

@SuppressWarnings({"unchecked", "deprecated"})