2005-жылы Java 5 версиясы менен бизге жаңы бир нече түшүнүк — аннотациялар келип кошулду.
Аннотациялар — бул коддо жарыялануучу синтакстикалык метадата формасы. Алар кодду компиляциялоодо же программанын иштетүү учурунда анализдөөгө колдонулат. Аннотацияны белгиси, маркери же компилятор үчүн көрсөтмө деп салыштырса болот.
Сен аннотациялар менен мурунтан эле жолуккансың. Мисалы, ата-энелик класстын методун кайра аныктоо үчүн методдун алдында @Override деп жазабыз. Бул аннотация, ал ата-энелик метод класс-мурастын ичинде кайра аныкталарын көрсөтөт.
Синтаксис:
@Override
public int hashCode() {
return super.hashCode();
}
Дароо эле белгилей кетейин, аннотациялар методдорго гана эмес, ал тургай пакеттер, класстар, методдор, талаалар жана параметрлер менен да колдонулат.
Аннотациялардын иштешин түшүнүү үчүн алгач маркердик интерфейстин түшүнүгү менен таанышуубуз керек. Java-разработчиктердин тили менен айтканда, класс белгилениши керек болгон зарылдык аныктоону талап кылган, бул иш-аракеттер Java тили пайда болгондон бери бар эле.
Java 5 чейин бул үчүн интерфейс колдонулуп келген, ал өзү да өзүнө окшобойт жана өз максатына туура келбейт эле. Ал методсуз, эч кандай келишимсиз, классты жекече белгилөө үчүн мурда колдонулуп келген.
Мындай интерфейс маркердик интерфейс деп аталган. Аты айтып тургандай эле анын милдети - класстарды JVM, компилятор же башка китепкана үчүн белгилөө. Азыркы учурда дагы айрым маркердик интерфейстер колдонулуп келүүдө, мисалы, Serializable. Бул маркер бизге классты белгилөөгө, мисалы, анын объектилерин сериализациялоого мүмкүнчүлүк берет.
Биз маркердик интерфейстердин аннотациялар пайда болгондон кийин да колдонулуп жаткандыгына ынандык.
Аннотация жана маркердик интерфейстин эквиваленттүү колдонулушу:
@MyAnnotation
public class MyClass {}
public class MyClass implements MarkerInterface {}
Эки ыкманын да максаты бирдей болсо да, алардын ишке ашырылышында явная айырма бар. Мисалы, класс белгилөө үчүн интерфейс жана аннотацияны карап көрөлү.
Интерфейс менен классты белгилегенде, туура эмес колдонууда же каталык пайда болгондо, ал компиляциялоонун учурунда аныкталып, программа иштетилбей калат.
Аннотацияларда баары мынчалык оңой эмес: каталык ронтаймда аныкталат, бул программа иштейт, бирок күтүлгөндөй бүткөрүлбөй калат дегенди билдирет.
Эгерде биз классты белгилеп, анын объектилерин белгилүү бир методдо колдонуу керек болсо:
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
}
Бул жерде эң жакшысы маркердик интерфейс колдонулат.
Эгерде аннотациялар колдонулса, анда ал техникалык мүмкүнчүлүктөрдүн болушун камсыздайт, мисалы, аннотация аркылуу параметрлерди өткөрүү керек болсо.
JDKдагы стандарттык аннотацияларды карап көрөлү:
Аннотация | Түшүндүрмө | Мисал |
---|---|---|
@Override | Методдун ата-энелик класстын методун же абстракттык класстын же интерфейстин методун кайра аныктап жаткандыгын көрсөтөт. |
|
@Deprecated | Кодду эскирген деп белгилейт. |
|
@SuppressWarnings | Аннотацияланган элемент үчүн компилятордун эскертмелерин өчүрөт. Эгерде бир нече эскерүү категорияларын өчүрүү керек болсо, аларды чечекчелерге кошуу керек, мисалы, @SuppressWarnings ({"unchecked", "cast"}). | Бул мисалда биз дженерик түрү аныкталган эмес болгон листке документ кошууга аракет кылып жатабыз. Компилятор бизге бул жөнүндө эскерет. Жакшысы, бул эскертмелер пайдалуу болсо да, кээде "ворнингдер" көп болуп, алар өтө эле кыйкырып кетет. Бул учурда аннотацияны эскертменин маркер параметрин белгилеп, методдо колдонсо болот. Маркерлер көп, ошондуктан баарын эс тутта кармоо шарт эмес, адатта IDEA өзү кайсыны коюуну айтып берет. Бир нече параметрлерди өткөрүү менен колдонуудагы дагы бир мисал: |
GO TO FULL VERSION