كيف تختار @NotNull في جافا؟ نظرة تحت الغطاء

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لعنة NullPointerException: اختيار @NotNull الصحيحة

\n\n

إذا كنت قد كتبت بلغة جافا ولو لمرة واحدة، فبالتأكيد واجهت NullPointerException (NPE). هذا هو الخطأ الأكثر شيوعًا الذي يعطل بيئة الإنتاج. ابتكر المطورون طريقة أنيقة لمكافحته — التعليقات التوضيحية @NotNull و @Nullable. ولكن المشكلة تكمن في وجود ما لا يقل عن عشرة تطبيقات مختلفة لهذا التعليق التوضيحي من بائعين مختلفين في عالم جافا. أي واحد تختار؟ لماذا يوجد الكثير منها؟ وماذا يحدث «تحت الغطاء» عند وضع @NotNull؟

\n\n

على Stack Overflow، جمع سؤال "Which @NotNull Java annotation should I use?" آلاف المشاهدات ومئات الأصوات. إنه صداع حقيقي للمبتدئين والمحترفين. في هذه المقالة، سنشرح بالتفصيل جميع الخيارات الرئيسية، ونعرض كودًا حقيقيًا، ونقدم خطة عمل واضحة. هيا بنا!

\n\n

لماذا نحتاج التعليقات التوضيحية @NotNull أصلاً؟

\n\n

جافا هي لغة ذات كتابة ثابتة، لكنها لا تستطيع التمييز بين المراجع null وغير null على مستوى الأنواع (على عكس Kotlin أو Rust). التعليقات التوضيحية هي بيانات وصفية تخبر المترجم، أو بيئة التطوير المتكاملة (IDE)، أو المحلل الثابت: «انتبه، هذا الحقل يجب ألا يكون null أبدًا!».

\n\n

استخدام @NotNull يعطي ثلاث مزايا رئيسية:

\n
    \n
  • اكتشاف مبكر للأخطاء — ستقوم IDE بتسليط الضوء على NPE المحتمل قبل التشغيل.
  • \n
  • توثيق الكود — يرى المطور عقد الطريقة فورًا.
  • \n
  • التكامل مع الأدوات — تستخدم Lombok و Checker Framework و FindBugs وغيرها هذه التعليقات التوضيحية لتوليد الكود والفحوصات.
  • \n
\n\n

المشكلة هي أن كل نظام بيئي كبير (JetBrains، Google، Eclipse، Oracle) أنشأ نسخته الخاصة. دعنا نستعرضها بالترتيب.

\n\n

المرشحون الرئيسيون: من هو من

\n\n

1. javax.annotation.Nonnull (FindBugs / JSR-305)

\n

كان هذا أول «معيار فعلي». تعليق توضيحي من الحزمة javax.annotation (JSR-305).

\n\n
import javax.annotation.Nonnull;\n\npublic class UserService {\n    public String greet(@Nonnull String name) {\n        return "Hello, " + name;\n    }\n}
\n\n

الإيجابيات: شائع تاريخيًا، مدعوم من الأدوات القديمة (FindBugs، IntelliJ IDEA مع إضافة).
\nالسلبيات: JSR-305 عالق في حالة «مسودة» ولم يصبح أبدًا جزءًا من Java SE. مكتبة com.google.code.findbugs:jsr305 لم يتم تحديثها منذ فترة طويلة. غير موصى به للمشاريع الجديدة.

\n\n

2. jakarta.annotation.Nonnull (Jakarta EE)

\n

بعد انتقال Java EE إلى Eclipse Foundation، تمت إعادة تسمية الحزمة javax.* إلى jakarta.*. التعليق التوضيحي jakarta.annotation.Nonnull هو الوريث الحديث.

\n\n
import jakarta.annotation.Nonnull;\n\npublic class RestController {\n    public void process(@Nonnull String data) {\n        // data مضمونة ألا تكون null\n    }\n}
\n\n

الإيجابيات: مدعوم رسميًا، جزء من Jakarta EE 9+، هناك فرصة للتوحيد القياسي.
\nالسلبيات: يتطلب إضافة تبعية jakarta.annotation-api. لم يتم تحديث جميع أدوات التحليل.

\n\n

3. org.jetbrains.annotations.NotNull (IntelliJ IDEA)

\n

التعليق التوضيحي الأكثر شيوعًا بين مستخدمي IntelliJ. يتم توزيعه في مكتبة org.jetbrains:annotations.

\n\n
import org.jetbrains.annotations.NotNull;\n\npublic class DataValidator {\n    public boolean validate(@NotNull String input) {\n        return input.length() > 3;\n    }\n}
\n\n

الإيجابيات: تكامل ممتاز مع IntelliJ IDEA (تسليط الضوء، الفحوصات، التوليد التلقائي للفحوصات). تبعية خفيفة (26 كيلوبايت فقط).
\nالسلبيات: ارتباط بـ IDE من JetBrains. إذا كان الفريق يستخدم Eclipse أو VS Code — سيكون التأثير أقل.

\n\n

4.

المدونات

توصيات الكتب