Google
خانه / آموزش / Java Annotation چیست؟

Java Annotation چیست؟

annotitaion

, جاوا انوتیشن اطلاعات اضافی به کد ما اضافه می کند که بخشی از برنامه نیست ولی تاثیر در اجرای برنامه می گذارد.

Annotations, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no direct effect on the operation of the code they annotate.

موضاعات مهمی که در انوتیشن مطرح است عبارتند از اطلاع رسانی به کامپایلر، انجام پردازش در زمان کامپایل و همچنین پردازش در زمان اجرا می باشد. انوتیشن ها توسط کامپایلر و یا ابزارهای تجزیه انوتیشن، تجزیه می شوند. قبل از این اطلاعات اضافی در javadoc قرار می گرفت، ولی توسط انوتیشن این اطلاعات را می توان در زمان کامپایل و حتی در زمان اجرا داشته باشیم. چند مثالی کاربردی خواهیم داشت و امیدوارم تا آخر این آموزش با من همراه باشید.

انوتیشن های زیادی توسط خود زبان جاوا استفاده می شوند که شاید با خیلی از آنها همچون @Override آشنا باشید. علاوه بر انواع موجود می توان انوتیشن اختصاصی داشته باشیم که در مثال های بعدی با آنها مواجه خواهیم شد. توجه داشته باشید که انوتیشن می تواند ورودی داشته باشد یا اینکه نداشته باشد.

چند نمونه:

@Override  به کامپایلر می گوید که متد اظهار شده در کلاس اصلی را با دستوراتی ما بازنویسی کند.

@SuppressWarnings می گوید که اخطارها را سرکوب کن. گرچه نمایش اخطار مفید است ممکن است در مواردی بخواهیم تا کامپایلر اخطاری را نمایش ندهد.

بعضی انوتیشن ها هم برای توصیف انوتیشن های دیگر بکار می رود. یعنی انوتیشن برای انوتیشن:

@Retention می گوید که انوتیشن موردنظر چگونه ذخیره شود. استفاده است مثلا RetentionPolicy.SOURCE  انوتیشن اشاره شده در سطح سورس کدمی ماند و توسط کامپایلر قابل دسترسی نباشد. اگر مقدار را  RetentionPolicy.CLASS  بگذاریم باعث می شود که انوتیشن مان در زمان کامپایل در نظر گرفته شود و توسط JVM ایگنور شود و یا توسط RetentionPolicy.RUNTIME انوتیشنمان توسط JVM نگهداری شود و در زمان اجرا قابل استفاده است.

@Documented می گوید که انوتیشن بکار رفته باید توسط ابزار سندسازی جاوا به سند تبدیل شوند.

@Target  توسط این انوتیشن، دسترسی المنت های جاوا به انوتیشن ما را محدود می کند و انواع انتخاب شده می توانند به انوتیشن ما دسترسی داشته باشند.

@Inherited توجه کنید که انوتیشن ها ارث بری ندارند. یعنی مثلا اگر یک کلاسی با یک انوتیشن خاصی درست کردید و یک کلاس دیگر از آن مشتق شد اگر از این انوتیشن استفاده نکرده باشید کلاس جدید انوتیشن های پدر را به ارث نمی برد. در مثالی که بعد از تعاریف می زنم تمام این مطالب را نمایش خواهم داد.

@Repeatable  این امکان در جاوای ۸ اضافه شده که می توانیم چند انوتیشن یکسان ولی با مقادیر مختلف را به یک متد اضافه کنیم. مثلاً در مثال زیر دوبار انوتیشن آلارم را با دو role متفاوت اعمال کردیم.

حال که با برخی انوتیشن های پیش فرض آشنا شدیم می خواهیم نحوه ساخت انوتیشن را باهم برسی کنیم. انوتیشن بسیار شبیه به اینترفیس ساخته می شود با این تفاوت که از کاراکتر @ استفاده می کنیم.

انوتیشنی ساختیم که اطلاعات کلی کارمندان را نگهداری می کند. همانطور که ملاحظه می کنید انوتیشن می تواند متد داشته باشد. متد های آن می تواند مقدار پیش فرض داشته باشد. همچنین انوتیشن ما خودش چند انوتیشن دارد که در بالا تعریف کردیم. سپس کلاس کارمند با انوتیشن تولید شده را بصورت زیر می سازیم:

سپس کلاس زیر را بسازید و برنامه را اجرا کرده و نتیجه را در کنسول ببینید. همانطور که در اول اشاره کردم این کلاس همان ابزار تجزیه انوتیشن است که توسط reflection در هنگام Runtime انوتیشن های موجود در کلاس را گرفته و نتیجه را نمایش می دهد.

ملاحظه کردید که چگونه می توان با استفاده از Annotation از Meta-data در هنگام Runtime دسترسی پیدا کرد و استفاده کرد.

همچنین می توان با استفاده از انوتیشن نوع ورودی را برای یک تابع محدود کرد و با آن مانند enum برخورد کرد. هرچند به نظر شخصی بنده بسیار مفید تر از enum خواهد بود زیرا اطلاعاتی به همراه دارد که بسیار جای مانور دارد. به مثال زیر توجه کنید.

IntDef

انوتیشنی است که توسط آن یک عنصر  integer را ارائه می دهد که در هنگام استفاده فقط می توانیم از مقادیر داده شده استفاده کنیم. ما یک انوتیشن داریم به عنوان روزهای هفته که انواع آن را از مقادیر static انتخاب کردیم. ( انواع آن روزهای هفته است)

حال متدی برای محاسبه حقوق داریم که ورودی آن را از جنس این انوتیشن می گذاریم. حال هر جا که متد را صدا بزنید intellisense ide یعنی Android Studio به عوان ورودی پیش فرض همان روز ها را به ما پیشنهاد می دهد! جالب است نه؟ این همان کاری است که در هنگام انتخاب visibility در View خودش بطور پیش فرض GONE و Visible و Invisible را پیشنهاد می دهد و اگر سورس کد View را در SDK های زیر ۲۲ ببینید ملاحظه خواهید کرد که از همین روش برای مشخص کردن ورودی هایش استفاده کرده است.

test

 

استفاده از StringDef هم بهمین صورت است با این تفاوت که انواع آن string هستند.

سورس کامل

منبع: بایت کد

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نخواهد شدعلامتدارها لازمند *

*

bigtheme