JavaRush /مدونة جافا /Random-AR /استراحة القهوة رقم 165. الحزم في جافا. طرق آمنة للخيط للم...

استراحة القهوة رقم 165. الحزم في جافا. طرق آمنة للخيط للمبتدئين

نشرت في المجموعة

حزم جافا

المصدر: Usemynotes سيساعدك هذا المنشور على فهم الحزم في Java بشكل أفضل وفهم الغرض منها وكيفية تنفيذها. استراحة القهوة رقم 165.  الحزم في جافا.  طرق آمنة للخيط للمبتدئين - 1

ما هي الحزم في جافا

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

بعض أنواع الحزم في Java:

  • java.lang - يأتي مرفقًا مع Java افتراضيًا.
  • java.io - يحتوي على الفئات والأساليب والعناصر الأخرى المتعلقة بالإدخال/الإخراج.

لماذا هناك حاجة للحزم؟

  • لتجنب تعارض الأسماء.
  • لتوفير الوصول الخاضع للرقابة.
  • لتحقيق تغليف البيانات.

كيفية إنشاء حزمة في جافا؟

لنقم بإنشاء حزمة تسمى الكمبيوتر . عادةً ما يتم كتابة اسم الحزمة بأحرف صغيرة. يتم ذلك فقط لتجنب تعارض الأسماء مع أسماء الفئات. سنقوم أيضًا بإنشاء واجهة تسمى Pluggable ، والتي ستكون موجودة في حزمة الكمبيوتر .
package computer;

interface Pluggable {
   public void pluggedIn();
   public void pluggedOut();
}
سنقوم الآن بإنشاء فئة تسمى PenDrive والتي ستقوم بتنفيذ الواجهة المذكورة أعلاه.
package computer;

public class PenDrive implements Pluggable {

   int storage = 64;

   public void pluggedIn () {
     System.out.println("Pen Drive is connected");
   }

   public void pluggedOut () {
     System.out.println("Pen Drive is removed");
   }

   public int storage() {
     return storage;
   }

   public static void main(String args[]) {
     PenDrive p = new PenDrive ();
     p.pluggedIn();
     System.out.println("Pen Drive Storage: " + p.storage());
     p.pluggedOut();
   }
}

كيفية إنشاء التسلسل الهرمي للحزمة في جافا؟

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

أنواع الحزم في جافا

الحزم المضمنة

الحزم المضمنة هي حزم تتكون من عدد كبير من الفئات المضمنة التي تشكل جزءًا من Java API. تشمل هذه الحزم:
  • java.util - تحتوي هذه الحزمة على عدد محدود من فئات الأدوات المساعدة التي يتم استخدامها لتنفيذ بنيات البيانات مثل القائمة المرتبطة والمجموعات وما إلى ذلك. كما أنه يدعم عمليات التاريخ والوقت وأكثر من ذلك بكثير.
  • java.net - يحتوي على فئات تستخدم لعمليات الشبكة.

الحزم المعرفة من قبل المستخدم

تسمى الحزم التي يحددها المستخدم بحزم المستخدم. يمكن للمستخدم إنشاء حزمة يدويًا وإدراج العديد من الفئات فيها كما يريد.

كيفية الوصول إلى حزمة من حزمة أخرى؟

يمكنك الوصول إلى حزمة من حزمة أخرى بثلاث طرق بسيطة:
  • استخدام العلامة النجمية في بيان الاستيراد
يتم استخدام علامة النجمة ( * ) لتمثيل "كل الأشياء" في Java. باستخدامه، يمكننا استيراد كل ما هو موجود داخل الحزمة الفرعية للحزمة. مثال: خذ بعين الاعتبار حزمة تسمى أدوات . إذا أردنا استيراد كل ما هو موجود داخل هذه الحزمة، فسنحتاج إلى استخدام عبارة الاستيراد مثل:
import tools.*;
  • باستخدام حزمة الاستيراد .ClassName؛
يعد ذكر اسم الفئة في الحزمة طريقة فعالة لاستيراد الفئات التي تحتاجها فقط إلى برنامجك، وبالتالي تجنب استيراد الفئات غير الضرورية. مثال: فكر في حزمة تسمى books . إذا أردنا فقط استيراد فئة أو واجهة معينة منها (سننظر إلى فئة الصفحات )، فيمكننا استيراد ذلك باستخدام:
import book.Pages;
  • باستخدام اسمك الكامل
توجد طريقة لاستخدام حزمة Java أو فئاتها مباشرةً باستخدام اسمها المؤهل بالكامل. بهذه الطريقة لن تضطر إلى استيراد الحزمة ويمكنك استخدامها مباشرة في البرنامج. مثال:
java.awt.List aSimpleList = new java.awt.List();

حجم الدفعة الافتراضي في جافا

افتراضيًا، تقوم Java باستيراد الحزمة java.lang . يحتوي على العديد من الفئات الشائعة الاستخدام في برامج Java البسيطة مثل String و Integer وغيرها. واحدة من أهم الفئات هي فئة الكائن ، والتي بدورها توجد أيضًا في الحزمة java.lang . يعتمد حجم هذه الحزمة على مكوناتها: 8 واجهات، 37 فئة، 3 تعدادات، 27 استثناء، 23 نوع خطأ، و5 أنواع تعليقات توضيحية.

طرق جافا الآمنة للخيط للمبتدئين

المصدر: متوسط ​​باستخدام هذه المقالة، يمكنك التعرف على كيفية عمل الطرق الآمنة لمؤشر الترابط في Java. استراحة القهوة رقم 165.  الحزم في جافا.  طرق آمنة للخيط للمبتدئين - 2لقد وجدت أن العديد من مطوري Java المبتدئين/المتوسطين يسيئون فهم كيفية عمل الأساليب الآمنة لسلسلة المحادثات في المشاريع الحقيقية. وبما أننا نعمل عادةً في بيئة متعددة الخيوط، فإن استخدامها الصحيح مهم جدًا. الطريقة الآمنة لمؤشر الترابط هي طريقة يمكن استدعاؤها من عدة سلاسل رسائل في وقت واحد دون التأثير على حالة بيانات بعضها البعض. يؤدي الفهم غير الكافي لهذا المفهوم إلى أخطاء يصعب العثور عليها وإصلاحها. لتجنب مثل هذه الأخطاء، دعونا نلقي نظرة على الأمثلة.

مثال 1:

public static int countLetters(String input) {
    int counter = 0;

    for (Character c : input.toCharArray()) {
        if (Character.isAlphabetic(c)) {
            counter++;
        }
    }

    return counter;
}
  • طريقة countLetters ثابتة، فهي تُرجع int وتقبل معلمة سلسلة كمدخلات.
  • يتم إنشاء عداد متغير بدائي داخل الطريقة، ثم تتكرر الحلقة عبر أحرف سلسلة الإدخال وتزيد عداد المتغير في كل مرة تتم فيها مواجهة حرف حرف.
هل هذه الطريقة آمنة؟ يقول العديد من المطورين لا، لأنه في هذه الحالة لدينا عملية زيادة ليست آمنة لمؤشر الترابط. دعونا معرفة ذلك. في نموذج ذاكرة Java لدينا مكدس وكومة. يحتوي كل مؤشر ترابط على مكدس خاص به، وتشترك كافة مؤشرات الترابط في نفس الكومة. في هذا الصدد، تكون بيانات المكدس آمنة دائمًا، لكن بيانات الكومة ليست كذلك. يقوم المكدس بتخزين الأوليات ومراجع الكائنات. الكومة تحتوي على الكائنات نفسها. هذا يعني أنه في مثال التعليمات البرمجية هذا، يقوم كل مؤشر ترابط بتخزين عداد متغير خاص به على المكدس وليس له أي تأثير على بيانات مؤشرات الترابط الأخرى، وبالتالي فإن الطريقة آمنة لمؤشر الترابط . لاحظ أن قيمة سلسلة الإدخال هي أيضًا كائن، ولكن السلسلة والأغلفة البدائية ( Integer ، Long ، Double ، Boolean وما إلى ذلك) تعتبر آمنة للخيط لأنها غير قابلة للتغيير.

المثال رقم 2:

public static int countLetters2(String input) {
    List<Character> listCounter = new ArrayList<>();

    for (Character c : input.toCharArray()) {
        if (Character.isAlphabetic(c)) {
            listCounter.add(c);
        }
    }

    return listCounter.size();
}
استخدم هذا الرمز نفس المنطق المستخدم في المثال الأول، ولكنه استخدم كائن قائمة بدلاً من متغير int البدائي . من الجزء السابق، نعلم أن الكائنات في Java يتم تخزينها في الكومة وأن القائمة هي كائن. نعلم أيضًا أن المكدس يخزن إشارات إلى كائنات موجودة في الكومة. في المثال رقم 2، يقوم كل مؤشر ترابط بإنشاء كائن ArrayList جديد : ويقوم المتغير listCounter بتخزين مرجع إلى كائنه في الكومة، لذلك لا يمكن لأي مؤشر ترابط آخر تغيير هذا الكائن.
List<Character> listCounter = new ArrayList<>();
هذا يعني أن هذه الطريقة آمنة للخيط.

المثال رقم 3:

public class CounterUtil { // singleton

    List<Character> listCounter = new ArrayList<>();

    public int countLetters3(String input) {
        for (Character c : input.toCharArray()) {
            if (Character.isAlphabetic(c)) {
                listCounter.add(c);
            }
        }

        return listCounter.size();
    }
}
في هذا المثال، لدينا فئة مفردة (وهذا أمر مهم) CounterUtil مع متغير عام listCounter . يتم إنشاء هذا المتغير في نفس الوقت الذي يتم فيه إنشاء المثيل المفرد. عندما تستدعي عدة سلاسل عمليات طريقة countChars3 ، فإنهم جميعًا يستخدمون نفس المتغير العام listCounter ، الذي يخزن مرجعًا لنفس الكائن في الكومة، وستؤثر سلاسل الرسائل هناك على بعضها البعض. لذلك يمكننا أن نستنتج أن هذه الطريقة ليست آمنة للخيط. وحتى إذا قمنا بتغيير List<Character> listCounter إلى متغير بدائي int counter ، فلن يكون أيضًا خيطًا آمنًا لأن جميع سلاسل الرسائل ستستخدم نفس المتغير البدائي.

المثال الأخير:

public static int countLetters4(List<Character> inputList) {
    List<Character> listCounter = new ArrayList<>();

    for (Character c : inputList) {
        if (Character.isAlphabetic(c)) {
            listCounter.add(c);
        }
    }

    return listCounter.size();
}
يقبل الأسلوب countLetters4 قائمة بالأحرف بدلاً من معلمة السلسلة . هنا لا يمكننا ضمان أن هذه الطريقة آمنة للخيط. لماذا؟ لأننا لا نستطيع التأكد من كيفية استخدام المطورين لهذه الطريقة. إذا قام مؤشر ترابط آخر من الخارج بتغيير البيانات في inputList في نفس الوقت مع طريقة counterLetters4 الخاصة بنا ، فقد يؤثر ذلك على النتيجة النهائية.

خاتمة

لقد نظرنا إلى أربعة أمثلة فقط، وهي لا تغطي جميع جوانب سلامة سلسلة المحادثات في مشاريع Java، ولكنها مكان جيد للبدء. في المرة القادمة التي ترى فيها طريقة في التعليمات البرمجية الخاصة بك، اسأل نفسك، "هل هذا الأسلوب آمن؟" وقريبا جدا سوف تفهم الجواب بوضوح.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION