الثوابت، final وأعراف التسمية
الثوابت، final وأعراف التسمية
في كل برنامج توجد قيم يجب ألا تتغير بعد تعيينها — عدد ساعات اليوم، أو معدل الضريبة، أو الحد الأقصى لعدد المحاولات. تمنحك Java الكلمة المحجوزة final لتقفل متغيرًا بحيث لا يمكن إعادة تعيين قيمته. إذا جمعت final مع المُعدِّل static حصلت على ثابت حقيقي على مستوى الصنف. علاوة على ذلك، تتبع مجتمع Java مجموعة صارمة من أعراف التسمية التي تُخبر كل قارئ فورًا بنوع المعرّف الذي ينظر إليه. كلا الموضوعين قواعد بسيطة ذات أثر كبير على جودة الكود.
الكلمة المحجوزة final
تعني إضافة final إلى متغير محلي أو حقل أنه يمكن تعيينه مرة واحدة فقط. أي محاولة لإعادة التعيين تُسبب خطأ في وقت الترجمة، فيكتشف المُصرِّف الخطأ قبل أن يعمل البرنامج.
final إلى مرجع كائن، لا يمكن للمرجع أن يشير إلى كائن آخر — لكن الكائن نفسه لا يزال قابلًا للتعديل. مثلًا، قائمة final List<String> لا يمكن إعادة تعيينها لقائمة جديدة، لكن يمكنك استدعاء add() عليها.
الثوابت على مستوى الصنف باستخدام static final
المتغير المحلي المعرَّف بـ final لا يُفيد إلا داخل دالة واحدة. لمشاركة ثابت عبر البرنامج بأكمله، أعلنه بصيغة public static final على مستوى الصنف. static تعني أنه ينتمي للصنف نفسه لا لأي كائن، فيُنشأ مرة واحدة ويُستخدم في كل مكان.
يُشير الكود الخارجي إلى ثابت عام بالصيغة اسمالصنف.اسمالثابت، أو مباشرةً بـ اسمالثابت من داخل نفس الصنف.
تسمية الثوابت: UPPER_SNAKE_CASE
العُرف في Java هو كتابة حقول static final بأسلوب UPPER_SNAKE_CASE — أحرف كبيرة كلها تفصل بينها شرطات سفلية. هذه إشارة بصرية تدل على أن القيمة ثابتة لا تتغير.
MAX_CONNECTIONS— صحيحTAX_RATE— صحيحdefaultTimeout— خطأ (يبدو كمتغير عادي)MAXCONNECTIONS— خطأ (صعب القراءة بدون فواصل)
static final مُسمًّى. قراءة MAX_LOGIN_ATTEMPTS أوضح بكثير من قراءة الرقم الحرفي 5 المتناثر في الكود.
نظرة عامة على أعراف التسمية في Java
يتبع مجتمع Java نظام تسمية موحدًا واحدًا. تعلّم هذه القواعد مرة واحدة وسيبدو كودك احترافيًا لأي مطور Java يقرأه.
الأصناف والواجهات — PascalCase
كل كلمة تبدأ بحرف كبير بلا فواصل. أصناف بالأسماء وواجهات بالصفات.
الدوال والمتغيرات — camelCase
تبدأ بحرف صغير وكل كلمة لاحقة بحرف كبير. الدوال عبارات فعلية والمتغيرات عبارات اسمية.
الحزم — أحرف صغيرة كليًا
أسماء الحزم كلها أحرف صغيرة، وعادةً اسم النطاق معكوسًا تفصل بين أجزائه نقاط. لا camelCase ولا شرطات سفلية.
الثوابت — UPPER_SNAKE_CASE
كما ذُكر سابقًا، حقول static final تُكتب بأحرف كبيرة مع شرطات سفلية. هذه الحالة الوحيدة في Java التي تظهر فيها الشرطات السفلية في الأسماء.
تطبيق كل شيء معًا
الصنف التالي يستخدم كل عرف بشكل صحيح:
Max_Discount أو maxDiscount لثابت، أو shopping_cart لاسم صنف، يُشير لكل قارئ Java أن شيئًا ما غير صحيح. أدوات تحليل الكود الساكن مثل Checkstyle تكتشف انتهاكات الأعراف تلقائيًا — التزم بها من البداية.
مرجع سريع
- الأصناف / الواجهات —
PascalCase—BankAccount،Serializable - الدوال / المتغيرات —
camelCase—calculateTax()،totalAmount - الثوابت (static final) —
UPPER_SNAKE_CASE—MAX_SIZE،PI - الحزم —
all.lowercase.dots—com.example.util
الخلاصة
استخدم final لمنع إعادة تعيين متغير وإيصال النية للقراء المستقبليين. استخدم public static final لإنشاء ثابت مشترك على مستوى الصنف. سمِّ تلك الثوابت بـ UPPER_SNAKE_CASE، وسمِّ الأصناف بـ PascalCase، وسمِّ كل شيء آخر بـ camelCase. هذه الأعراف ليست تفضيلات أسلوبية اختيارية — إنها المعيار الذي تتبعه كل قاعدة كود Java، وانتهاكها علامة واضحة للمطورين على أن شيئًا ما لا ينتمي إلى هذا المكان.