در زبان جاوا، اطمینان از این که متغیرها، پارامترها یا مقادیر بازگشتی null نیستند، برای جلوگیری از خطاهای زمان اجرا مانند NullPointerException بسیار مهم است. دو انوتیشن رایج به نامهای NotNull@ و Nonnull@ معمولاً برای این منظور استفاده میشوند، اما نقشها و زمینههای متفاوتی دارند. بیایید به تفاوتهای این دو انوتیشن بپردازیم:

انوتیشن NotNull@ (از پکیج jakarta.validation.constraints.NotNull)
انوتیشن NotNull@ به طور گسترده در جاوا برای اهداف اعتبارسنجی استفاده میشود. زمانی که این انوتیشن را روی یک فیلد، پارامتر یا مقدار بازگشتی متد اعمال میکنید، مشخص میکنید که این مقدار هرگز نباید null باشد. این موضوع بهویژه زمانی اهمیت پیدا میکند که با JavaBeans، اشیای انتقال داده (DTOs)، یا کلاسهای موجودیت (Entity Classes) کار میکنید.
قدرت واقعی NotNull@ زمانی ظاهر میشود که در کنار یک فریمورک اعتبارسنجی مانند Jakarta Bean Validation (قبلاً با نام JSR 303/JSR 380 شناخته میشد) استفاده شود. در زمان اجرا، این فریمورک بررسی میکند که آیا فیلد یا پارامتر انوتیشنشده null است یا خیر. اگر مقدار null باشد، یک استثنای اعتبارسنجی (Validation Exception) پرتاب میشود و از پردازش دادههای نامعتبر توسط برنامه جلوگیری میشود.
به بیان ساده، انوتیشن NotNull@ مطمئن میشود که مقدار فیلد، پارامتر یا مقدار بازگشتی خالی (null) نباشد، مخصوصاً وقتی که بخواهیم اطلاعات کاربر را بررسی یا ذخیره کنیم.
بهعنوان مثال، کلاس User را در نظر بگیرید:

در اینجا، انوتیشن NotNull@ تضمین میکند که مقدار username نمیتواند null باشد زمانی که شیء User در حال اعتبارسنجی یا ذخیرهسازی است.
انوتیشن Nonnull@ (از پکیج jakarta.annotation.Nonnull)
از طرف دیگر، انوتیشن Nonnull@ بیشتر برای بهبود کیفیت کد و جلوگیری از مشکلات مربوط به null در مرحله توسعه استفاده میشود. وقتی Nonnull@ را به یک پارامتر متد، نوع بازگشتی یا یک فیلد اعمال میکنید، به توسعهدهندگان و ابزارهای تحلیل استاتیک میگویید که این مقدار هرگز نباید null باشد.
برخلاف NotNull@، انوتیشن Nonnull@ هیچ اعتبارسنجی در زمان اجرا انجام نمیدهد. در عوض، به IDEهایی مثل IntelliJ IDEA یا Eclipse کمک میکند که مشکلات احتمالی را در زمان توسعه تشخیص دهند. به عنوان مثال، اگر سعی کنید مقدار null را به یک پارامتر با انوتیشن Nonnull@ ارسال کنید، IDE ممکن است یک هشدار یا خطا ایجاد کند و به شما این امکان را بدهد که مشکل را قبل از اجرای کد برطرف کنید.
مثال زیر را در نظر بگیرید:

در این مورد، انوتیشن Nonnull@ به توسعهدهنده و ابزارها اعلام میکند که مقدار username هرگز نباید null باشد، و این باعث کاهش احتمال وقوع خطای NullPointerException میشود.
نکات کلیدی:
هدف: انوتیشن NotNull@ بیشتر برای اعتبارسنجی در زمان اجرا استفاده میشود تا از صحت دادهها در هنگام اجرای برنامه اطمینان حاصل شود. در مقابل، انوتیشن Nonnull@ بیشتر برای جلوگیری از مشکلات احتمالی مربوط به null در زمان توسعه و با استفاده از تحلیل استاتیک به کار میرود.
تأثیر:
NotNull@ بر رفتار زمان اجرا تأثیر میگذارد.Nonnull@ کیفیت کد را در زمان کامپایل یا توسعه با ابزارهای کدنویسی بهبود میبخشد.زمان استفاده:
NotNull@ در مدلهای دادهای خود استفاده کنید زمانی که نیاز دارید مطمئن شوید برخی فیلدها یا پارامترها null نیستند.Nonnull@ در امضای متدها یا نوعهای بازگشتی استفاده کنید تا عدم وجود null را در زمان کدنویسی مستند و enforce کنید.نتیجه گیری:
هر دو انوتیشن NotNull@ و Nonnull@ ابزارهای مهمی در جعبهابزار یک توسعهدهنده جاوا هستند و هرکدام هدف خاص خود را دارند. با درک و استفاده صحیح از این دو، میتوانید کدی قویتر و مقاومتر در برابر خطا بنویسید و اطمینان حاصل کنید که مشکلات مربوط به null چه در زمان اجرا و چه در زمان توسعه بهخوبی شناسایی و مدیریت میشوند.
ممنون که تا آخر این پست همراه من بودید ، امیدوارم براتون مفید بوده باشه 🙌🙏✌ (:
بقیه آموزش های من با نام (mister developer) را می توانید در تلگرام و اینستاگرام دنبال کنید!!
کانال تلگرام: mister_developerr
اینستاگرام: mister_developerr
موفق و پیروز باشید