Java - Napomene (Annotations)


Java napomene su metapodaci (podaci o podacima) za naš izvorni kod programa. Oni pružaju dodatne informacije o programu prevoditelju, ali nisu dio samog programa. Ove napomene ne utiču na izvršavanje sastavljenog programa. Napomene počinju sa @. Sintaksa je:

@AnnotationName

Uzmimo primjer napomene @Override. Napomena @Override navodi da metoda koja je označena ovom napomenom nadjačava metodu nadklase s istim imenom metode, vrstom i popisom parametara. Nije potrebno koristiti @Override prilikom nadjačavanja metode. Međutim, ako ga koristimo, prevoditelj daje grešku ako nešto nije u redu (poput pogrešnog tipa parametra), dok nadjačava metodu.


Primjer 1: Primjer napomene @Override

class Animal {
  public void displayInfo() {
    System.out.println("Ja sam životinja.");
  }
}

class Dog extends Animal {
  @Override
  public void displayInfo() {
    System.out.println("Ja sam pas.");
  }
}

class Main {
  public static void main(String[] args) {
    Dog d1 = new Dog();
    d1.displayInfo();
  }
}

Prikaz koda iz gornjeg primjera izgledaće ovako:

Ja sam pas.

U ovom primjeru metoda displayInfo() prisutna je i u nadklasi Animal i u podklasi Dog. Kad se pozove ova metoda, umjesto podređene klase poziva se metoda potklase.



Formati napomena

Napomene takođe mogu uključivati elemente (članove/atribute/parametre).


1. Oznake markera

Oznake napomene ne sadrže članove/elemente. Koristi se samo za označavanje deklaracije. Sintaksa je:

@AnnotationName()

Pošto ove napomene ne sadrže elemente, zagrade se mogu isključiti. Na primjer:

@Override

2. Napomene s jednim elementom

Napomene za jedan element sadrži samo jedan element. Njegova sintaksa je:

@AnnotationName(elementName = "elementValue")

Ako postoji samo jedan element, programerska praksa je da se taj element imenuje kao value.

@AnnotationName(value = "elementValue")

U ovome se slučaju može isključiti i naziv elementa. Ime elementa prema zadanim postavkama će biti value.

@AnnotationName("elementValue")

3. Napomene s više elemenata

Ove napomene sadrže više elemenata odvojenih zarezima. Njegova sintaksa je:

@AnnotationName(element1 = "value1", element2 = "value2")


Postavljanje napomena

Svaka deklaracija se može označiti napomenom stavljanjem iznad te deklaracije. Od Jave 8, napomene se takođe mogu postaviti ispred tipa. Kao što smo spomenuli, Java napomene se mogu postaviti iznad deklaracija klase, metode, interfejsa, polja i drugih programskih elemenata.


Primjer 2: Primjer napomene @SuppressWarnings

import java.util.*;

class Main {
  @SuppressWarnings("Neprovjereno")
  static void wordsList() {
    ArrayList wordList = new ArrayList<>();

// Ovo uzrokuje nekontrolirano upozorenje
    wordList.add("ittutorijali"); 

    System.out.println("Lista riječi => " + wordList);
  }

  public static void main(String args[]) {
    wordsList();
  }
}

Prikaz koda iz gornjeg primjera izgledaće ovako:

Lista riječi => [ittutorijali]

Ako se gornji program napiše bez korištenja napomene @SuppressWarnings ("neoznačeno"), prevoditelj će i dalje kompajlirati program, ali će dati upozorenja poput:

Main.java uses unchecked or unsafe operations.
Lista riječi => [ittutorijali]

Dobijamo sljedeće upozorenje

Main.java uses unchecked or unsafe operations

zbog sljedeće izjave.

ArrayList wordList = new ArrayList<>();

To je zato što nismo definisali generički tip niza. Ovo upozorenje možemo popraviti navođenjem generičkih podataka unutar zagrada <>.



Vrste napomena

Unaprijed definisane napomene (Predefined annotations)

  • @Deprecated
  • @Override
  • @SuppressWarnings
  • @SafeVarargs
  • @FunctionalInterface

Meta-napomene (Meta-annotations)

  • @Retention
  • @Documented
  • @Target
  • @Inherited
  • @Repeatable