اگه یکم با جاوا سر و کله زده باشید یا حتی چندتا از framework های محبوبش مثل Hibernate یا Spring کار کرده باشید حتما به @ ها خیلی برخوردید.
پس بهتره اول ببینم این @ ها چی هستند و توی یه پست دیگه بریم سراغ ساختن یکی از این @ ها موافقید؟
در زبان برنامه نویسی جاوا @ ها برای اضافه کردن فراداده هایی(metadata) به سورس کد ماست. @ ها بخش قدرتمندی از جاوا هستند که از جاوا 5 به بعد به آن اضافه شدند. در واقع @ ها در بعضی موقع جایگزینی برای فایل های xml هستند و ما رو از شر xml های مضخرف راحت می کنند.
باید یادآوری کرد که هر چند ما قادر هستیم @ ها را به پکیج ها، کلاس ها، اینترفیس ها، متد ها و فیلد ها پیوست کنیم اما این @ ها به خودی خود هیچ کاری را انجام نمی دهند. در واقع بهتره بگیم @ ها جادو نمی کنند.
خب حالا که فهمیدیم @ هیچ کار خاصی نمی کنند بهتره ببینیم ما با اونا میتونیم چیکار کنیم:
خود جاوا یکسری Built-in @ داره که بهتره اونا رو بشناسیم. این @ ها توی پکیج java.lang هستند:
استفاده از این @ ها باعث ایجاد یا ساکت کردن هشدار ها و error هایی از سمت کامپایلر میشه. استفاده از این @ ها مستحب موکد (یا همون "BestPractice") هست؛ چرا که باعث جلوگیری از خطاهای برنامه نویسی در آینده میشه.
@Override
این @ موقعی استفاده می شود که میخواهیم رفتار یه متد از کلاس پدر را بازنویسی کنیم.
@SuppressWarnings
این @ باعث می شود که هشدار های موقع کامپایل ساکت شوند و ما اطلاع داده نشوند.
@SafeVarargs
این @ هم مربوط میشه به متد هایی که تعداد ورودی متغییر براشون در نظر میگیریم.(توضیحات بیشتر توی این لینک هستش)
@Deprecated
این @ بیشتر توی Api ها دیده میشه و این اطلاع رو به استفاده کنندش میده که توسعه دهنده قصد نداره دیگه از این api استفاده کنه و توی نسخه های بعدی احتمالا حذف میشه.
@FunctionalInterface
این @ بالای اینترفیس های SAM قرار میگیره. کاربرد SAM اینترفیس ها که در جاوا 8 ایجاد شده، بیشتر در لامبدا ها هستش.
@Native
این @ روی فیلد های کلاس قابل استفادس و این منظور رو میرسونه که فیلد از سمت native code ارجاع داده شده است.
همیشه سعی کنید که از @Override و @FunctionalInterface حتما استفاده کنید. نرم افزار هایی که توسعه دهنده زیاد دارند و ممکنه برای بلند مدت به توسعه اونها بپردازیم سر همین استفاده نکردن از این @ ها ممکنه داخلشون مشکلاتی به وجود بیاد که برای رفع کردنشون پوستمون کنده بشه. مخصوصا @Override که داستان های زیادی رو در صورت استفاده نکردن ازش ممکنه تولید کنه.
این @ ها توی @ های دیگه مورد استفاده قرار میگیره و موقعی که میخواهیم یه @ جدید بسازیم خیلی به کارمون میان. این @ ها توی پکیج java.lang.annotation هستند.
خب حالا مثل دسته قبل به توضیح تک تکشون خواهیم پرداخت:
@Target
این @ محدوده استفاده از این @ را مشخص میکنه. در واقع مشخص میکنه که این @ میتونه برای متد استفاده بشه یا فیلد یا...
مثال استفاده ازش هم به این صورت هستش:
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD}) public @interface SafeVarargs { }
@Retention
بعضی از @ ها برای hint دادن به کامپایلر هستند ولی بعضی هاشون runtime مورد استفاده قرار میگیرند. خب با این @ ما میتونیم این مسئله رو مشخص کنیم. این @ سه وضعیت داره:
حالت default این @ هم حالت اول هستش و مثال استفاده ازش به شرح زیره:
@Retention(RetentionPolicy.RUNTIME) @Target(TYPE) public @interface RetentionAnnotation {
@Inherited
این @ باعث میشه که @ مورد تعریف توی کلاس های فرزند هم اعمال بشه. پس میتونیم بگیم که در حالت معمول @ ها به ارث نمیرسند.
@Inherited @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public @interface InheritedAnnotation { }
@Documented
این @ باعث میشه usage یک @ در جاوا داک هم بیاید.
@Repeatable
بعضی موقع ها هست که استفاده مجدد از یک @ در یک المنت جاوایی نیاز میشه. قبل از جاوا 7 باید این موضوع رو با دسته بندی @ در یک container ها هندل می کردیم.
@Schedules({ @Schedule(time = "15:05"), @Schedule(time = "23:00") }) void scheduledAlarm() { }
از جاوا 7 به بعد یه روش تمیز تر اومد که باعث میشد ما بتونیم از یک @ چندبار برای یک المنت استفاده کنیم. اون چیزی نبود جز @Repeatable.
@Schedule @Schedule(time = "15:05") @Schedule(time = "23:00") void scheduledAlarm() { }
توی این نوشته سعی شد تا با @ های جاوا بیشتر آشنا بشیم. @ هایی که هر توسعه جاوایی باید در موردشون اطلاعاتی را داشته باشه.
انشالله توی پست بعد به این مبحث میپردازیم که چطور یه @ برای خودمون بسازیم.
این نوشته ترجمه خودمونی از مطلب سایت baeldung بود که لینک نوشته اصلیش اینه: