Објектно орјентисано

програмирање

Владимир Филиповић

vladaf@matf.bg.ac.rs

Aнотација

Владимир Филиповић

vladaf@matf.bg.ac.rs

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 3 / 51

Aнотације (још се називају и забелешке) обезбеђују податке о
програму које саме по себи нису део програма.
  • Анотације су специјална врста коментара
    • Исто као коментари, анотације се мењају нити утичу на
семантику програма, тј. на понашање програма током
његовог извршавања.
  • Анотације су мета-описи
    • За разлику од коментара, анотацијама могу приступити и
њих могу користити други развијени програмски алати
или чак и сам програм који развијамо.

Анотације (забелешке)

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 35 / 51

Aнотације се користе у различите сврхе:
  • Обезбеђивање додатних информација преводиоцу –
анотације се могу користити од стране преводиоца ради
детектовања гршака или ускраћивања упозорења.
  • Процесирање у времену превођења и у времену
испоручивања – софтверски алати могу процесирати
анотације ради генерисања кода, XML датотека, итд.
  • Процесирање у времену извршавања — неке анотације су
доступне за испитивање у времену извршавања.
Анотације се могу применити на декларације: декларације
класа, поља, метода и других елемената програма.
Када се примењују на декларације, конвенција је да се свака
анотација пише у новој линији.

Анотације ( 2 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 36 / 51

У свом најростијем облику, анотација има следећи формат:
@Entity
Знак @ указује преводиоцу да се ради о анотацији.
У примеру који следи, име анотације је Override:
@Override
void mySuperMethod() { ... }
Анотација може да садржи елементе, било именоване или
неименоване, и да поставе вредности за те елементе:
@Author(
name = "Benjamin Franklin",
date = " 3 / 27 / 2003 "
)
class MyClass() { ... }
или
@SuppressWarnings(value = "unchecked")
void myMethod() { ... }

Формат анотације

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 37 / 51

Ако постоји само један именовани елемент, тада се име елемента
може уклонити приликом доделе вредности, као у:
@SuppressWarnings("unchecked")
void myMethod() { ... }
Ако анотација нема елемената (маркерска), тада се и заграде могу
уклонити, што је и био случај у примеру са @Override анотацијом.
Такође је могуће поставити више анотација на исту декларацију:
@Author(name = "Jane Doe")
@EBook
class MyClass { ... }
Тип анотације може бити новонаправљени (енг. custom) тип, или
један од типова из пакета java.lang или java.lang.annotation у оквиру
Java SE API. У претходним примерима, анотације Override и
SuppressWarnings су предефинисани типови Јава анотације, а Author
и Ebook су новонаправљени типови анотације.

Формат анотације ( 2 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 38 / 51

Предефинисани типови анотације већ постоје и користе се у
језику Јава.
Ови типови анотације су дефинисани у пакету java.lang.
То су:
  • Deprecated
  • Override
  • SuppressWarnings
  • SafeVarargs
Поред тога, у Java SE 8 ће се појавити још један тип анотације,
назван FunctionalInterface.

Предефинисани тип анотације

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 39 / 51

Анотација Deprecated указује да означени елеменат више није
потребан (застарео је) и да се надаље неће користити.
Кад год програм користи метод, класу или поље које је анотирано
Deprecated анотацијом, Јава преводилац генерише упозорење.
Када елеменат постане застарео, то такође треба и документовати
коришћењем the Javadoc тага @deprecated.
И таг и анотација починњу симболом @, иза кога код Javadoc тага
следи мало слово d а код анотације велико слово D.
Пример.
// Javadoc komentar
/**
* @deprecated
* objasnjenje zasto je metod nepotreban i kako se preporucuje da se radi
*/
@Deprecated
static void deprecatedMethod() { }

Предефинисани тип анотације ( 2 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 40 / 51

Анотација Override информише преводилац да анотирани елемент
треба да превазиђе елеменат који је декларисан у надкласи.
Пример.
// mark method as a superclass method
// that has been overridden
@Override
int overriddenMethod() { }
Иако се у Јава програмирању не захтева да се приликом
превазилажења метода користи ова анотација, њено коришење
помаже у превенцији грешака.
Ако метод маркиран са анотацијом Override некоректно превазиђе
метод надкласе, тада преводилац генерише грешку.

Предефинисани тип анотације ( 3 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 41 / 51

Анотација @SuppressWarnings налаже преводиоцу да не приказује
конкретни тип упозорења, које би у супротном било приказано.
Пример. У коду који следи се користи застарели метод
deprecatedMethod, за који преводилац обично генерише упозорење.
У овом случају, међутим, анотација метода useDeprecatedMethod је
блокирала генерисање једног типа упозорења.
// koristi zastareli metod i nalaze prevodiocu da ne generise upozorenje
@SuppressWarnings("deprecation")
void useDeprecatedMethod() {
objectOne.deprecatedMethod();
}
Спецификација језика Јава разликује две категорије упозорења
преводиоца: застарелост (енг. deprication) и непровререност (енг.
unchecked). Непроверена упозорења се могу појавити кад се ради
са старим кодом, кодом који је писан пре развоја генеричких класа
и метода.

Предефинисани тип анотације ( 4 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 42 / 51

Да би се блокирало генерисање обе категорије упозорења,
користи се следећа синтакса:
@SuppressWarnings({"unchecked", "deprecation"})
Анотација @SafeVarargs , када се примени на метод или на
конструктор, обезбеђује да се у телу метода/контруктора не
извршавају операције које могу бити несигурне за параметре
променљивог типа овог метода/конструктора, тј. за varargs
параметре. Ако се користи овај тип анотације, тада се код
преводиоца блокира и генерисање упозорења непроверивости
који би се односили на коришћење varargs параметара.
Анотација @FunctionalInterface , која ће бити уведена у Java SE 8 ,
указује да декларација типа треба да буде функционални
интерфејс, као што је дефинисано у спецификацији језика Јава.

Предефинисани тип анотације ( 5 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 43 / 51

Креирање новог типа анотације је слично креирању интерфејса,
при чену декларацији типа анотације претходи знак @.
Анотација не сме садржавати кључну реч extends. Међутим,
анотације имплицитно наслеђују интерфејс Annotation.
Тело анотације се састоји од декларације метода (без тела метода).
Матоди унутар тела анотације се понашају као поља.
Пример. Тип анотације Description, којом се нпр. описује
програмска датотека, може да има следећи облик:
@Retention( RetentionPolicy.RUNTIME )
@interface Description
{
String author();
String date();
}

Креирање новог типа анотације

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 44 / 51

Када анотација датог типа придружује декларацији, потребно је
обезбедити одговарајуће вредности за чланове типа анотације.
Пример (наставак). Када је креиран тип анотације Description, тада
се њиме могу анотирати класе и методе (нпр. Test и testMethod):
@Description( author = "Vlado", date = " 22 / 10 / 2011 , 23 / 10 / 2011 " )
public class Test {
@Description( author = "Vlado", date = " 22 / 10 / 2011 " )
public static void testMethod(){
System.out.println( "Welcome to Java" );
System.out.println( "This is an example of Annotations" );
}
public static void main( String args[] ){
testMethod();
showAnnotations();
}
}

Креирање новог типа анотације ( 2 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 45 / 51

У примеру није приказан метод showAnnotations, који коришћењем
рефлексије приказује на стандардном улазу анотације које су
придружене класи и методама.
Метод showAnnotations ће бити приказан и детаљно анализиран
нешто касније, у делу презентације који се односи на коришћење
рефлексије ради испитивања анотација.

Креирање новог типа анотације ( 3 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 46 / 51

Пример. У претходном примеру се, приликом креирања новог
типа анотације Description, користила анотација Retention. Ова
анотација Retention је предефинисана (већ постоји), служи за
анотирање анотација, па се због тога назива мета-анотација.
Мета-анотације су дефинисане у пакету java.lang.annotation.
То су: @Retention, @Documented, @Target и @Inherited.
Поред ових, у у Java SE 8 ће се појавити још један тип мета-
анотације, назван @Repeatable.
Мета-анотација @Retention одређује како се памти анотација:
RetentionPolicy.SOURCE – анотација се памти само на нивоу
изворног кода и бива игнорисана од стране преводиоца.
RetentionPolicy.CLASS – анотација се памти од стране преводиоца
током превођења, али је игносрише JVM.
RetentionPolicy.RUNTIME – анотација се памтио од стране JVM, па се
може користити у окружењу извршавања.

Мета-анотације ( 1 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 47 / 51

Мета-анотација @Documented указује да се анотација која је
маркирана са Documented треба документовати коришћењем
Javadoc алата (подразумевано је да се анотације не укључују у
Javadoc). За више информација консултовати документацију о
Javadoc алатима.
Мета-анотација @Target означава ограничење типа Јава елемента
на који се може примењивати тако маркирана анотација. Могући
циљ маркиране анотације, тј. вредност мета-анотације је нека од
следећа четири вредности:
ElementType.ANNOTATION_TYPE примењује се на тип анотације.
ElementType.CONSTRUCTOR примењује се на конструктор.
ElementType.FIELD примењује се на поље или на особину.
ElementType.LOCAL_VARIABLE примењује се на локалну променљиву.
ElementType.METHOD примењује се на метод.

Мета-анотације ( 2 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 48 / 51

ElementType.PACKAGE примењује се на декларацију пакета.
ElementType.PARAMETER примењујњ се на параметар метода.
ElementType.TYPE примењује се на ма који елеменат класе.
Мета-анотација @Inherited указује да тип анотације може бити
наслеђен из надкласе, што није подразумевано понашање.
Када корисник испитује тип анотације, а класа нема анотацију
датог типа, тада ће се надкласа испитивати ѕа дати тип анотације.
Ова мета-анотација се односи само на анотације класе.
Мета-анотација @Repeatable указује да означена анотација може
бити примењена више пута на исту декларацију.

Мета-анотације ( 3 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 49 / 51

Reflection API садржи методе за испитивање анотација.
Старији начин за испитивање анотација су методи
getAnnotation(Class) и getAnnotation(Class), који су дефинисани у
класама Class и Method респективно.
Ови методи враћају једну анотацију, исто као и новији метод
getAnnotationByType(Class) класе AnnotatedElement, под
претпоставком да постоји анотација захтеваног типа.
У Java SE 8 су укључени и додтни методи који пролазе кроз
контејнер анотација и једним позивом враћз све анотације датог
типа. Такав је метод getAnnotations(Class) класе AnnotatedElement.

Испитивање анотација

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 50 / 51

Пример. Метод који следи приказује анотације:
public static void showAnnotations()
{
Test test = new Test();
try{
Class c = test.getClass();
Description annotation 1 = (Description) c.getAnnotation( Description.class );
System.out.println( "Name of the class: " + c.getName() );
System.out.println( "Author of the class: " + annotation 1 .author() );
System.out.println( "Date of Writing the class: " + annotation 1 .date() );
Method m = c.getMethod( "testMethod" );
Description annotation 2 = m.getAnnotation( Description.class );
System.out.println( "Name of the method: " + m.getName() );
System.out.println( "Author of the method: " + annotation 2 .author() );
System.out.println( "Date of Writing the method: " + annotation 2 .date() );
} catch (NoSuchMethodException ex){
System.out.println( "Invalid Method..." + ex.getMessage() );
}
}

Испитивање анотација ( 2 )

Математички факултет (^) vladaf@matf.bg.ac.vladaf@matf.bg.ac.rs rs 51 / 51

Захвалница

Велики део материјала који је укључен у ову презентацију је
преузет из презентације коју је раније (у време када је он
држао курс Објектно орјентисано програмирање) направио
проф. др Душан Тошић.
Хвала проф. Тошићу што се сагласио са укључивањем тог
материјала у садашњу презентацији, као и на помоћи коју ми
је пружио током конципцирања и реализације курса.
Надаље, један део материјала је преузет од колегинице
Марије Милановић.
Хвала Марији Милановић на помоћи у реализацији ове
презентације.