سؤال

ولقد سمعت من أنواع ما يشار إليها باسم "محاصر" في بعض اللغات.

في جاوة، لقد سمعت من "autoboxing". ما هذا؟ هل وجود فئات المجمع لنوع؟ كيف يمكن تغيير قانون بلدي إذا أنا أعمل مع أنواع محاصر أو بدون علبة؟

هل كانت مفيدة؟

المحلول

تعتبر

وبعض أنواع البيانات "بدائية"، وهذا يعني أنهم لا يعاملون مثل كائن وليس لديهم خصائص كائن.

في معظم المنصات، الأعداد الصحيحة والحروف هي أمثلة على الأنواع التي هي بدائية ولكن يمكن محاصر.

والملاكمة يعني التفاف لهم في كائن بحيث يصبح لديهم سلوك كائن.

والمعنى الدقيق والسلوك يعتمد على اللغة التي تستخدمها. بعض اللغات (مثل من Smalltalk ... على الأقل waaay الى الوراء عندما كنت أفعل ذلك ...) لا تسمح أي نوع من أنواع البدائية والنظر في كل شيء ليكون كائن، ولكن هناك جزاء أداء المرتبطة بذلك، لأنه في نهاية من اليوم، يحتاج المعالج للعمل مع الأرقام الخام والذاكرة الخام إلى القيام بعمل مفيد. إذا كنت ترغب في إضافة اثنين من الأعداد الصحيحة التي تم محاصر، على سبيل المثال، وراء الكواليس أنهم "بدون علبة" إلى أنواع بدائية، وتضاف الأرقام، وأنهم ثم محاصر مرة أخرى إلى عدد صحيح جديد.

نصائح أخرى

ومعلومات أكثر تحديدا لجاوا:

وAutoboxing يسمح جافا لتحويل تلقائيا أشياء مثل boolean وint إلى هم Boolean الإصدارات كائن وInteger تلقائيا في معظم الحالات. كما يسمح العكس أن يحدث.

وعلى سبيل المثال:

int a = 3; // no boxing is happening
Integer b = 3;  // newer versions of java automatically convert the int 3 to Integer 3
int c = b;  // these same versions also automatically convert Integer 3 to int 3

والإصدارات القديمة من جافا التي ليس لديها autoboxing سوف يتطلب هذا الرمز أن تفعل نفس الشيء:

int a = 3;  // works the same
Integer b = new Integer(3);  //must set up a Integer object manually
int c = b.intValue(); //must change Integer object to a primitive

ولكن هناك بعض الحالات حيث لا يزال لديك لتفعل أشياء يدويا. على سبيل المثال، تخيل لديك فئة مع اثنين من الأساليب مثل ذلك:

assertEquals(int a, int b);
assertEquals(Object a, Object b)

والآن، إذا حاولت القيام بذلك:

Integer a = 3;
int b = 3;
assertEquals(a, b);  // this will not compile

والسبب هذا لا يعمل لأنه لا يمكن معرفة ما إذا كان ينبغي خدمة Unbox a إلى int أو مربع b إلى Integer. ولذلك فمن الغامض الذي توقيع الأسلوب يجب أن يتم استدعاء. لإصلاح هذا يمكنك القيام به واحد من هؤلاء:

assertEquals((int) a, b);
assertEquals(a, (Integer) b);

نعم، الملاكمة يعني أخذ نوع قيمة والتغليف في نوع مرجع. منذ قدم جافا autoboxing يمكنك القيام به:

void foo(Object bar) {}
//...
    foo(1);

وسوف تتحول تلقائيا جافا كثافة العمليات 1 إلى عدد صحيح. في الإصدارات السابقة يهمني ما عليك القيام به:

foo(new Integer(1));

وAutoboxing هو الأكثر فائدة في جافا عند العمل مع الأدوية، لأنك لا تستطيع استخدام البدائيون مع الأدوية، وذلك ل[إينتس] مخزن في قائمة، وكنت قد لجعل List<Integer> ووضع [إينتس] في قائمة محاصر.

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

وعموما عند العمل مع مجموعات، وأنت تتعامل مع صفائف من كائنات. في لغات مثل جافا، وهناك فرق بين البدائية وكائن. عندما بدائية و"محاصر"، انها في الأساس مجرد التفاف حول بدائية لذلك يلعب لطيفة مع بقية إطار هذا ما نتوقع كائن.

وAutoboxing هو مجرد عمل من أعمال وضع بدائية إلى كائن أو سحب بدائية من كائن شفاف بحيث لم يكن لديك ما يدعو للقلق خطوة اضافية من فعل ذلك بنفسك.

ومحاصر يعني أن أخذوا نوع القيمة العادية وإنشاء كائن من حوله. نوع من مثل وضعه في صندوق. وعموما يجب تجنب هذا، لأن من النفقات العامة للبناء الكائن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top