CodeGym /مدونة جافا /Random-AR /10 أشياء تحتاج لمعرفتها حول المعدل الثابت في Java
John Squirrels
مستوى
San Francisco

10 أشياء تحتاج لمعرفتها حول المعدل الثابت في Java

نشرت في المجموعة
في Java، يعني المعدل الثابت أن شيئًا ما يرتبط مباشرة بفئة ما: إذا كان الحقل ثابتًا، فهو ينتمي إلى الفئة؛ إذا كانت الطريقة ثابتة، فهي تنتمي إلى الفئة. ونتيجة لذلك، يمكنك استخدام اسم الفئة لاستدعاء أسلوب ثابت أو الإشارة إلى حقل ثابت. على سبيل المثال، إذا countكان الحقل ثابتًا في Counterالفئة، فهذا يعني أنه يمكنك الإشارة إلى المتغير بالتعبير التالي: Counter.count. 10 أشياء تحتاج لمعرفتها حول المعدل الثابت في Java - 1وبطبيعة الحال، يجب أن تؤخذ في الاعتبار معدلات الوصول. على سبيل المثال، privateتتوفر الحقول فقط داخل الفئة التي تم الإعلان عنها. والحقول protectedمتاحة لجميع الفئات داخل الحزمة، وكذلك لجميع فئاتها الفرعية خارج الحزمة. لنفترض أن Counterالفصل لديه طريقة ثابتة increment()تتمثل مهمتها في زيادة countالحقل. لاستدعاء هذه الطريقة، يمكنك استخدام Counter.increment(). ليست هناك حاجة لإنشاء مثيل للفئة Counterللوصول إلى حقل أو أسلوب ثابت. هذا هو الفرق الأساسي بين المتغيرات والأساليب الثابتة (الفئة) والمتغيرات والأساليب غير الثابتة (المثيل). ملاحظة مهمة. لا تنس أن الأعضاء الثابتين في الفصل ينتمون مباشرة إلى الفصل، وليس إلى أي مثيل للفئة. أي أن قيمة المتغير الثابت countستكون هي نفسها لجميع Counterالكائنات. في هذه المقالة، سنلقي نظرة على الجوانب الأساسية لاستخدام المعدل الثابت في Java، بالإضافة إلى بعض الميزات التي ستساعدك على فهم مفاهيم البرمجة الأساسية.

ما يجب أن يعرفه كل مبرمج عن المعدل الثابت في Java.

في هذا القسم، سنلقي نظرة على الجوانب الرئيسية لاستخدام الأساليب والحقول والفئات الثابتة. لنبدأ بالمتغيرات.
  1. لا يمكنك الوصول إلى الأعضاء غير الثابتين في فئة ضمن سياق ثابت، مثل أسلوب ثابت أو كتلة. سيؤدي تجميع الكود أدناه إلى حدوث خطأ:

    public class Counter {
    private int count;
    public static void main(String args []) {
       System.out.println(count); //  Compile time error
    }
    }

    وهذا أحد الأخطاء الأكثر شيوعًا التي يرتكبها مبرمجو Java، وخاصة المبتدئين. نظرًا لأن mainالطريقة ثابتة والمتغير countليس كذلك، فإن استخدام printlnالطريقة داخل mainالطريقة سيؤدي إلى حدوث "خطأ في وقت الترجمة".

  2. على عكس المتغيرات المحلية، فإن الحقول والأساليب الثابتة ليست موجودة thread safeفي Java. من الناحية العملية، يعد هذا أحد الأسباب الأكثر شيوعًا لمشاكل الأمان في البرمجة متعددة الخيوط. مع الأخذ في الاعتبار أن كل مثيل لفئة يشير إلى نفس النسخة من متغير ثابت، فإن مثل هذا المتغير يحتاج إلى الحماية أو "التأمين" بواسطة الفئة. لذلك، عند استخدام المتغيرات الثابتة، تأكد من أنها صحيحة synchronizedلتجنب مشاكل مثل race conditions.

  3. تتمتع الأساليب الثابتة بميزة عملية تتمثل في عدم الحاجة إلى إنشاء كائن جديد في كل مرة تريد الاتصال بها. يمكن استدعاء الطريقة الثابتة باستخدام اسم الفئة التي تعلن عنها. ولهذا السبب تعتبر هذه الطرق مثالية للطرق factoryوالأساليب utility. يعد الفصل java.lang.Mathمثالًا رائعًا: جميع أساليبه تقريبًا ثابتة. يتم تمييز فئات الأدوات المساعدة في Java finalلنفس السبب.

  4. هناك نقطة أخرى مهمة وهي أنه لا يمكنك تجاوز ( @Override) الطرق الثابتة. إذا قمت بالإعلان عن مثل هذه الطريقة في ملف subclass، أي طريقة بنفس الاسم والتوقيع، فما عليك سوى "إخفاء" طريقة superclassبدلاً من تجاوزها. تُعرف هذه الظاهرة باسم method hiding. هذا يعني أنه إذا تم الإعلان عن طريقة ثابتة في كل من الفئتين الأصل والطفل، فستعتمد الطريقة التي يتم استدعاؤها دائمًا على نوع المتغير في وقت الترجمة. على عكس تجاوز الطريقة، لن يتم تنفيذ مثل هذه الأساليب عند تشغيل البرنامج. دعونا نفكر في مثال:

    class Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the parent class / static method");
         }
    }
    
    class Car extends Vehicle {
         public static void kmToMiles(int km) {
              System.out.println("Inside the child class / static method");
         }
    }
    
    public class Demo {
       public static void main(String args []) {
          Vehicle v = new Car();
           v.kmToMiles(10);
      }
    }

    إخراج وحدة التحكم:

    داخل الفئة الأصل/الطريقة الثابتة

    يوضح الكود بوضوح أنه على الرغم من أن الكائن هو Car، يتم استدعاء الطريقة الثابتة في Vehicleالفصل، حيث تم استدعاء الطريقة في وقت الترجمة. ولاحظ أنه لم تكن هناك أخطاء في التجميع!

  5. علاوة على ذلك، بخلاف فئات المستوى الأعلى، يمكنك إعلان الفئات ثابتة. تُعرف هذه الفئات باسم nested static classes. وهي مفيدة لتوفير تماسك أفضل. من الأمثلة الصارخة على فئة ثابتة متداخلة HashMap.Entry، وهي عبارة عن بنية بيانات بداخلها HashMap. تجدر الإشارة إلى أنه، مثل الفئات الداخلية، يتم الإعلان عن الفئات المتداخلة الثابتة في ملف .class منفصل. وبالتالي، إذا قمت بتعريف خمس فئات متداخلة في فئتك الرئيسية، فسيكون لديك 6 ملفات بامتداد .class. مثال آخر هو الإعلان الخاص بنا Comparator، مثل مقارنة العمر ( AgeComparator) في Employeeالفصل.

  6. يمكن أيضًا تحديد المُعدِّل الثابت في كتلة ثابتة، تُعرف باسم "كتلة التهيئة الثابتة"، والتي يتم تنفيذها عند تحميل الفصل. إذا لم تعلن عن مثل هذه الكتلة، تقوم Java بجمع كافة الحقول الثابتة في قائمة واحدة وتهيئتها عند تحميل الفصل. لا يمكن للكتلة الثابتة طرح الاستثناءات المحددة، ولكن يمكنها طرح الاستثناءات غير المحددة. في هذه الحالة ExceptionInInitializerErrorسيحدث. من الناحية العملية، أي استثناء يحدث أثناء تهيئة الحقول الثابتة سيتم تغليفه بهذا الخطأ بواسطة Java. وهذا أيضًا هو السبب الأكثر شيوعًا لـ NoClassDefFoundError، لأن الفصل لن يكون في الذاكرة عند الرجوع إليه.

  7. من المفيد معرفة أن الطرق الثابتة ترتبط في وقت الترجمة، على عكس ربط الطرق الافتراضية أو غير الثابتة، التي ترتبط في وقت التشغيل عند استدعائها على كائن حقيقي. وفقًا لذلك، لا يمكن تجاوز الأساليب الثابتة في Java، نظرًا لأن تعدد الأشكال لا ينطبق عليها في وقت التشغيل. يعد هذا قيدًا مهمًا يجب مراعاته عند الإعلان عن طريقة ثابتة. إن القيام بذلك يكون منطقيًا فقط عندما لا تكون هناك قدرة أو حاجة لتجاوز الطريقة في فئة فرعية. تعد أساليب المصنع وأساليب المنفعة أمثلة جيدة على الاستخدام السليم للمعدل الثابت. يشير جوشوا بلوخ إلى العديد من المزايا التي تتمتع بها أساليب المصنع الثابتة مقارنة بالمنشئين في كتابه Java الفعال، وهو أمر إلزامي لكل مبرمج Java.

  8. تعد التهيئة جانبًا مهمًا للكتلة الثابتة. تتم تهيئة الحقول أو المتغيرات الثابتة بعد تحميل الفئة في الذاكرة. ترتيب التهيئة من أعلى إلى أسفل، بنفس الترتيب الذي تم الإعلان عنه في الملف المصدر لفئة Java. نظرًا لأنه تتم تهيئة الحقول الثابتة بطريقة آمنة لمؤشر الترابط، يتم استخدام هذه العملية أيضًا لتنفيذ النمط Singleton. إذا كنت لا تستخدم as Enumلسبب Singletonما، فلديك بديل جيد. ولكن في هذه الحالة، يجب أن تأخذ في الاعتبار أن هذه ليست تهيئة "كسولة". هذا يعني أنه سيتم تهيئة الحقل الثابت حتى قبل أن "يطلب" شخص ما ذلك. إذا كان الكائن كثيف الموارد أو نادر الاستخدام، فإن تهيئته في كتلة ثابتة لن يعمل لصالحك.

  9. أثناء عملية التسلسل، transientلا يتم إجراء تسلسل للحقول الثابتة، مثل المتغيرات. في الواقع، إذا قمت بحفظ أي بيانات في حقل ثابت، فسوف تحتوي على قيمتها الأولية (الافتراضية) بعد إلغاء التسلسل. على سبيل المثال، إذا كان الحقل الثابت عبارة عن حقل ثابت int، فستكون قيمته صفرًا بعد إلغاء التسلسل. إذا كان نوعه float، فستكون القيمة 0.0. إذا كان الحقل Object, فستكون القيمة null. لأكون صادقًا، يعد هذا أحد الأسئلة الأكثر شيوعًا حول التسلسل في المقابلات الخاصة بوظائف Java. لا تقم بتخزين بيانات الكائن الأساسية في حقل ثابت!

  10. وأخيرا، دعونا نتحدث عن الاستيراد الثابت. يحتوي هذا المعدل على الكثير من القواسم المشتركة مع importالعبارة القياسية، ولكنه يختلف من حيث أنه يسمح لك باستيراد واحد أو كل أعضاء الفئة الثابتة. بمجرد استيراد الأساليب الثابتة، يمكن الوصول إليها كما لو تم الإعلان عنها في نفس الفئة. وبالمثل، من خلال استيراد الحقول الثابتة، يمكننا الوصول إليها دون تحديد اسم الفئة. ظهرت هذه الميزة في Java 1.5 وتعمل على تحسين إمكانية قراءة التعليمات البرمجية عند استخدامها بشكل صحيح. يتم العثور على هذا البناء في أغلب الأحيان في اختبارات JUnit، نظرًا لأن جميع مطوري الاختبار تقريبًا يستخدمون الاستيراد الثابت لطرق التأكيد، على سبيل المثال assertEquals()ومتغيراتها المحملة بشكل زائد.

  11. هذا كل شئ حتى الان. يحتاج كل مبرمج Java إلى معرفة جميع جوانب المُعدِّل الثابت المذكور أعلاه. استعرضت هذه المقالة المعلومات الأساسية حول المتغيرات الثابتة والحقول والأساليب وكتل التهيئة والواردات. كما تطرقت أيضًا إلى بعض الخصائص المهمة التي لا بد من معرفتها لكتابة برامج Java وفهمها. آمل أن يتقن كل مطور استخدامه الماهر للأعضاء الثابتة، لأنه مهم جدًا للتطوير الجاد للبرمجيات."

تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION