الثوابت في Java | final و static final بشرح تفصيلي للمبتدئين

16:00 دقائق مجاني
شرح الثوابت من الصفر: ما معنى final؟ ولماذا نحتاج الثوابت؟ وما الفرق بين final و static final؟ مع أمثلة واقعية وأخطاء شائعة.

في البرمجة توجد قيم ينبغي ألا تتغير طوال عمل البرنامج. مثل: رقم ثابت، حد أقصى، نسبة ضريبة ثابتة، أو قيمة مرجعية.

إذا كانت القيمة لا ينبغي أن تتغير، فالأفضل أن تجعلها ثابتًا. في Java نستخدم الكلمة final لإنشاء ثابت.

فكرة final سهلة: عندما تعطي المتغير قيمة لأول مرة، لا يمكنك تغييرها بعد ذلك.

مثال بسيط: ثابت باستخدام final

انظر إلى هذا المثال:

final int MAX_USERS = 100;

System.out.println(MAX_USERS);

// MAX_USERS = 200;  // خطأ: لا يمكن تغيير قيمة final

لاحظ:

  • بمجرد تعريف MAX_USERS وإعطائه قيمة، يصبح غير قابل للتغيير.
  • إذا حاولت تغييره ستظهر رسالة خطأ عند الترجمة (Compile Time).

لماذا نستخدم الثوابت؟

  • منع الأخطاء: لا أحد يستطيع تغيير قيمة مهمة بالخطأ.
  • وضوح المعنى: اسم الثابت يشرح نفسه (مثل MAX_USERS).
  • سهولة التعديل: إذا احتجت تعديل الحد الأقصى مستقبلًا تعدله في مكان واحد.

الثوابت تجعل الكود “يتحدث” ويصبح مفهومًا حتى بعد أشهر من كتابته.

الفرق بين final و static final

حتى الآن استخدمنا final في متغير عادي داخل دالة مثل main. لكن أحيانًا نريد ثوابت “عامة” تُستخدم في كل مكان داخل البرنامج. هنا نستخدم static final.

مثال: ثابت عام داخل كلاس:

class Config {
  public static final double PI = 3.14159;
}

System.out.println(Config.PI);

ماذا يعني هذا؟

  • static: يعني أن القيمة مرتبطة بالكلاس نفسه، لا تحتاج إنشاء كائن.
  • final: يعني أنها ثابتة لا تتغير.
  • بالتالي تستطيع الوصول إليها مباشرة: Config.PI.

قاعدة عملية سهلة للمبتدئ

  • إذا كانت القيمة ثابتة داخل نطاق صغير (مثل داخل main) استخدم final.
  • إذا كانت القيمة ثابتة وتحتاجها في أكثر من مكان داخل البرنامج، ضعها في كلاس كـ public static final.

أخطاء شائعة

  • تعريف final دون إعطائه قيمة ثم نسيان تهيئته لاحقًا.
  • اعتبار final “شيئًا اختياريًا”؛ في الحقيقة هو مفيد جدًا لجودة الكود.
  • كتابة أسماء الثوابت بحروف صغيرة؛ الأفضل غالبًا كتابتها بحروف كبيرة للفصل عن المتغيرات العادية.

✅ بعد أن فهمت الثوابت، سننتقل إلى مفهوم قريب منه لكنه مختلف: static، الذي يربط الأشياء بالكلاس نفسه.