RezaDehghani
RezaDehghani
خواندن ۴ دقیقه·۴ سال پیش

Annotation در جاوا

تاریخچه

اگه یکم با جاوا سر و کله زده باشید یا حتی چندتا از framework های محبوبش مثل Hibernate یا Spring کار کرده باشید حتما به @ ها خیلی برخوردید.

پس بهتره اول ببینم این @ ها چی هستند و توی یه پست دیگه بریم سراغ ساختن یکی از این @ ها موافقید؟

در زبان برنامه نویسی جاوا @ ها برای اضافه کردن فراداده هایی(metadata) به سورس کد ماست. @ ها بخش قدرتمندی از جاوا هستند که از جاوا 5 به بعد به آن اضافه شدند. در واقع @ ها در بعضی موقع جایگزینی برای فایل های xml هستند و ما رو از شر xml های مضخرف راحت می کنند.

باید یادآوری کرد که هر چند ما قادر هستیم @ ها را به پکیج ها، کلاس ها، اینترفیس ها، متد ها و فیلد ها پیوست کنیم اما این @ ها به خودی خود هیچ کاری را انجام نمی دهند. در واقع بهتره بگیم @ ها جادو نمی کنند.

کلیات

خب حالا که فهمیدیم @ هیچ کار خاصی نمی کنند بهتره ببینیم ما با اونا میتونیم چیکار کنیم:

  1. در مورد هشدارها و خطاها به کامپایلر اطلاع دهیم
  2. در زمان کامپایل سورس کد را تغییر بدهیم
  3. در زمان RunTime رفتاری رو تغییر بدیم یا تماشا کنیم

Built-in Annotation

خود جاوا یکسری Built-in @ داره که بهتره اونا رو بشناسیم. این @ ها توی پکیج java.lang هستند:

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

استفاده از این @ ها باعث ایجاد یا ساکت کردن هشدار ها و error هایی از سمت کامپایلر میشه. استفاده از این @ ها مستحب موکد (یا همون "BestPractice") هست؛ چرا که باعث جلوگیری از خطاهای برنامه نویسی در آینده میشه.

@Override

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

@SuppressWarnings

این @ باعث می شود که هشدار های موقع کامپایل ساکت شوند و ما اطلاع داده نشوند.

@SafeVarargs

این @ هم مربوط میشه به متد هایی که تعداد ورودی متغییر براشون در نظر میگیریم.(توضیحات بیشتر توی این لینک هستش)

@Deprecated

این @ بیشتر توی Api ها دیده میشه و این اطلاع رو به استفاده کنندش میده که توسعه دهنده قصد نداره دیگه از این api استفاده کنه و توی نسخه های بعدی احتمالا حذف میشه.

@FunctionalInterface

این @ بالای اینترفیس های SAM قرار میگیره. کاربرد SAM اینترفیس ها که در جاوا 8 ایجاد شده، بیشتر در لامبدا ها هستش.

@Native

این @ روی فیلد های کلاس قابل استفادس و این منظور رو میرسونه که فیلد از سمت native code ارجاع داده شده است.

همیشه سعی کنید که از @Override و @FunctionalInterface حتما استفاده کنید. نرم افزار هایی که توسعه دهنده زیاد دارند و ممکنه برای بلند مدت به توسعه اونها بپردازیم سر همین استفاده نکردن از این @ ها ممکنه داخلشون مشکلاتی به وجود بیاد که برای رفع کردنشون پوستمون کنده بشه. مخصوصا @Override که داستان های زیادی رو در صورت استفاده نکردن ازش ممکنه تولید کنه.

Meta-Annotations

این @ ها توی @ های دیگه مورد استفاده قرار میگیره و موقعی که میخواهیم یه @ جدید بسازیم خیلی به کارمون میان. این @ ها توی پکیج java.lang.annotation هستند.

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

خب حالا مثل دسته قبل به توضیح تک تکشون خواهیم پرداخت:

@Target

این @ محدوده استفاده از این @ را مشخص میکنه. در واقع مشخص میکنه که این @ میتونه برای متد استفاده بشه یا فیلد یا...

مثال استفاده ازش هم به این صورت هستش:

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD}) public @interface SafeVarargs { }

@Retention

بعضی از @ ها برای hint دادن به کامپایلر هستند ولی بعضی هاشون runtime مورد استفاده قرار میگیرند. خب با این @ ما میتونیم این مسئله رو مشخص کنیم. این @ سه وضعیت داره:

  1. RetentionPolicy.SOURCE – نه runtime و نه برای کامپایلر قابل مشاهدس
  2. RetentionPolicy.CLASS – برای کامپایلر قابل مشاهدس
  3. RetentionPolicy.RUNTIME – برای هر دوحالت قابل مشاهدس

حالت default این @ هم حالت اول هستش و مثال استفاده ازش به شرح زیره:

@Retention(RetentionPolicy.RUNTIME) @Target(TYPE) public @interface RetentionAnnotation {

@Inherited

این @ باعث میشه که @ مورد تعریف توی کلاس های فرزند هم اعمال بشه. پس میتونیم بگیم که در حالت معمول @ ها به ارث نمیرسند.

@Inherited @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface InheritedAnnotation { }

@Documented

این @ باعث میشه usage یک @ در جاوا داک هم بیاید.

@ExcelCell داک جاوا برای
@ExcelCell داک جاوا برای

@Repeatable

بعضی موقع ها هست که استفاده مجدد از یک @ در یک المنت جاوایی نیاز میشه. قبل از جاوا 7 باید این موضوع رو با دسته بندی @ در یک container ها هندل می کردیم.

@Schedules({ @Schedule(time = &quot15:05&quot), @Schedule(time = &quot23:00&quot) }) void scheduledAlarm() { }

از جاوا 7 به بعد یه روش تمیز تر اومد که باعث میشد ما بتونیم از یک @ چندبار برای یک المنت استفاده کنیم. اون چیزی نبود جز @Repeatable.

@Schedule @Schedule(time = &quot15:05&quot) @Schedule(time = &quot23:00&quot) void scheduledAlarm() { }

خلاصه

توی این نوشته سعی شد تا با @ های جاوا بیشتر آشنا بشیم. @ هایی که هر توسعه جاوایی باید در موردشون اطلاعاتی را داشته باشه.

انشالله توی پست بعد به این مبحث میپردازیم که چطور یه @ برای خودمون بسازیم.

منبع

این نوشته ترجمه خودمونی از مطلب سایت baeldung بود که لینک نوشته اصلیش اینه:

https://www.baeldung.com/java-default-annotations

annotationjavaجاوا
شاید از این پست‌ها خوشتان بیاید