JavaRush /مدونة جافا /Random-AR /التغليف والفك والتعبئة

التغليف والفك والتعبئة

نشرت في المجموعة
مرحبًا! أنت بالفعل على دراية بالأنواع البدائية، وعملت معهم كثيرًا. التغليف والفك والتعبئة - 1تتمتع البدائيات في البرمجة، وفي Java على وجه الخصوص، بالعديد من المزايا: فهي تشغل القليل من الذاكرة، وبالتالي تزيد من كفاءة البرنامج، وتنقسم بوضوح إلى نطاقات من القيم. ومع ذلك، في عملية تعلم Java، كررنا أكثر من مرة، مثل الشعار، " في Java، كل شيء هو كائن ". لكن البدائيين هم دحض مباشر لهذه الكلمات. إنهم ليسوا كائنات. إذن فإن مبدأ "كل شيء هو كائن" خاطئ؟ ليس حقيقيًا. في جافا، كل نوع بدائي له شقيقه التوأم، فئة المجمع ( Wrapper). ما هو المجمع؟ الغلاف عبارة عن فئة خاصة تخزن قيمة البدائية داخل نفسها. ولكن بما أن هذه فئة، فيمكنها إنشاء مثيلاتها الخاصة. سوف يقومون بتخزين القيم البدائية الضرورية بالداخل، بينما يكونوا كائنات حقيقية. أسماء فئات المجمع تشبه إلى حد كبير أسماء الأوليات المقابلة، أو تتطابق تماما معها. لذلك، سيكون من السهل جدًا تذكرها.
فئات المجمع لأنواع البيانات البدائية
أنواع البيانات البدائية فئات المجمع
كثافة العمليات عدد صحيح
قصير قصير
طويل طويل
بايت بايت
يطفو يطفو
مزدوج مزدوج
شار شخصية
منطقية منطقية
يتم إنشاء كائنات فئة الغلاف تمامًا مثل أي كائنات أخرى:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
تسمح لك فئات الغلاف بتخفيف عيوب الأنواع البدائية. الأمر الأكثر وضوحًا هو أن البدائيين ليس لديهم طرق . على سبيل المثال، ليس لديهم طريقة toString()، لذلك لا يمكنك، على سبيل المثال، تحويل رقم intإلى سلسلة. ولكن مع فئة المجمع Integerيكون الأمر سهلاً.
public static void main(String[] args) {

   Integer i = new Integer(432);

   String s = i.toString();
}
ستكون هناك أيضًا صعوبات في التحول العكسي. لنفترض أن لدينا سلسلة نعرف بالتأكيد أنها تحتوي على رقم. ومع ذلك، في حالة النوع البدائي، intلن نتمكن من الحصول على هذا الرقم من السلسلة وتحويله في الواقع إلى رقم. ولكن بفضل الطبقات المجمعة، لدينا الآن هذه الفرصة.
public static void main(String[] args) {

   String s = "1166628";

   Integer i = Integer.parseInt(s);

   System.out.println(i);
}
الإخراج: 1166628 لقد نجحنا في استرداد رقم من سلسلة وتخصيصه لمتغير مرجعي Integer i. بالمناسبة، حول الروابط. أنت تعلم بالفعل أنه يتم تمرير المعلمات إلى الأساليب بطرق مختلفة: يتم تمرير العناصر الأولية حسب القيمة، ويتم تمرير الكائنات حسب المرجع. يمكنك استخدام هذه المعرفة عند إنشاء أساليبك: إذا كانت طريقتك تعمل، على سبيل المثال، مع أرقام كسرية، لكنك تحتاج إلى منطق التمرير حسب المرجع، فيمكنك تمرير المعلمات إلى الطريقة Double/Floatبدلاً من double/float. بالإضافة إلى ذلك، بالإضافة إلى الأساليب، تحتوي فئات المجمع على حقول ثابتة مريحة للغاية للاستخدام. على سبيل المثال، تخيل أنك تواجه الآن مهمة: طباعة أكبر عدد ممكن من الأرقام على وحدة التحكم int، ثم أقل عدد ممكن. تبدو المهمة بسيطة، ولكن مع ذلك، لن تتمكن من القيام بها بدون Google. وتتيح لك فئات المجمع حل "المشكلات اليومية" التالية بسهولة:
public class Main {
   public static void main(String[] args) {

       System.out.println(Integer.MAX_VALUE);
       System.out.println(Integer.MIN_VALUE);
   }
}
تسمح لك هذه المجالات بعدم تشتيت انتباهك عن المهام الأكثر خطورة. ناهيك عن حقيقة أنه أثناء عملية طباعة الرقم 2147483647 (هذا هو MAX_VALUE بالضبط)، ليس من المستغرب أن نخطئ في كتابته :) بالإضافة إلى ذلك، في إحدى المحاضرات السابقة، لفتنا الانتباه بالفعل إلى حقيقة أن كائنات فئات المجمع غير قابلة للتغيير .
public static void main(String[] args) {

   Integer a = new Integer(0);
   Integer b = new Integer(0);

   b = a;
   a = 1;
   System.out.println(b);
}
الإخراج: 0 الكائن الذي أشار إليه المرجع في الأصل аلم يتغير حالته، وإلا bلتغيرت القيمة أيضًا. كما هو الحال مع String، بدلاً من تغيير حالة الكائن المجمّع، يتم إنشاء كائن جديد تمامًا في الذاكرة. لماذا قرر منشئو Java في النهاية الاحتفاظ بالأنواع البدائية في اللغة؟ نظرًا لأن كل شيء يجب أن يكون كائنًا، ولدينا بالفعل فئات مجمعة يمكن استخدامها للتعبير عن كل ما تعبر عنه البدائيات، فلماذا لا نتركها في اللغة ونزيل البدائيات؟ الجواب بسيط - الأداء. تسمى الأنواع البدائية بالبدائية لأنها خالية من العديد من الميزات "الثقيلة" للأشياء. نعم، يحتوي الكائن على العديد من الطرق الملائمة، لكنك لا تحتاج إليها دائمًا. في بعض الأحيان تحتاج فقط إلى الرقم 33 أو 2.62 أو قيمة true/ false. في المواقف التي لا تكون فيها جميع فوائد الكائنات مهمة ولا تكون ضرورية لكي يعمل البرنامج، فإن البدائيين سيقومون بعمل أفضل بكثير.

التعبئة التلقائية/التفريغ التلقائي

إحدى ميزات البدائيات وفئاتها المجمعة في Java هي autoboxing/autounboxing، التغليف والفك والتعبئة - 2 دعونا نفهم هذا المفهوم. كما تعلمنا سابقًا، فإن Java هي لغة موجهة للكائنات. هذا يعني أن جميع البرامج المكتوبة بلغة Java مكونة من كائنات. البدائيون ليسوا كائنات. ومع ذلك، يمكن تعيين متغير فئة المجمع قيمة من النوع البدائي. تسمى هذه العملية بالملاكمة التلقائية . بنفس الطريقة، يمكن تعيين متغير من النوع البدائي إلى كائن من فئة المجمع. تسمى هذه العملية بالفتح التلقائي . على سبيل المثال:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // auto unpacking
       y = x * 123; // autopacking
   }
}
في السطر 5، قمنا بتعيين قيمة x البدائية لـ y، وهي كائن من فئة الغلاف Integer. كما ترون، ليس هناك حاجة إلى إجراءات إضافية لهذا: المترجم يعرف ذلك int، Integerوفي الواقع، نفس الشيء . هذا هو التفريغ التلقائي. يحدث نفس الشيء مع autoboxing في السطر 6: يتم تعيين قيمة الأوليات للكائن y بسهولة (x*123). هذا مثال على التعبئة التلقائية. ولهذا السبب تمت إضافة كلمة "تلقائي": لتعيين مراجع بدائية لكائنات من فئات الغلاف الخاصة بها (والعكس صحيح)، لا تحتاج إلى القيام بأي شيء، كل شيء يحدث تلقائيًا . مريحة، أليس كذلك؟ :) تتجلى راحة كبيرة جدًا أخرى للتعبئة التلقائية/التفريغ التلقائي في تشغيل الطرق. والحقيقة هي أن معلمات الطريقة تخضع أيضًا للتعبئة التلقائية والتفريغ التلقائي . وعلى سبيل المثال، إذا أخذ أحدهما كائنين كمدخل Integer، فيمكننا بسهولة تمرير العناصر الأولية العادية إلى هناك int!
public class Main {
   public static void main(String[] args) {

       printNumber(7);//regular int, even without a variable
   }

   public static void printNumber(Integer i) {
       System.out.println("You entered a number" + i);
   }
}
الإخراج: لقد أدخلت الرقم 7. وهو يعمل بالعكس:
public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println("You entered a number" + i);
   }
}
هناك نقطة مهمة يجب تذكرها: لا يعمل التشغيل التلقائي والتفريغ مع المصفوفات !
public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};

       printArray(i);//error, won't compile!
   }

   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
ستؤدي محاولة تمرير مصفوفة من العناصر الأولية إلى طريقة تأخذ مصفوفة من الكائنات كمدخلات إلى حدوث خطأ في الترجمة. أخيرًا، دعونا مرة أخرى نقارن بإيجاز بين البدائيات والأغلفة البدائية:
  • لديك ميزة الأداء
الأغلفة:
  • أنها تسمح لك بعدم انتهاك مبدأ "كل شيء هو كائن"، بحيث لا تخرج الأرقام والرموز والقيم المنطقية صحيح/خطأ من هذا المفهوم
  • توسيع القدرة على العمل مع هذه القيم من خلال توفير أساليب وحقول ملائمة
  • يكون ضروريًا عندما تتمكن بعض الطرق من العمل حصريًا مع الكائنات
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION