كم عدد الكائنات "الجديدة" المتداخلة التي يمكن إنشاؤها في جافا?

StackOverflow https://stackoverflow.com//questions/22023867

سؤال

class car{
    Salon s ;
}
class Salon{
     Radio musicsystem ;
}
class Radio{
    Button play ;
}
class Button{
     String s ;
}

void main(){
    car mustang = new car( new Salon( new Radio(new Button ("fight club song"))))
}

أستطيع أن أتخيل بسهولة أن هناك الكثير جديد (جديد(جديد (جديد ....) )).مدى عمق يمكنك الذهاب?أنا" حدسي " أشعر أنه يمكن أن يكون سيئا للمترجم/جفم/النظام أن يكون مستويات كثيرة جدا من الكائنات...

هل جافا لديها قيود على العمق?

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

المحلول

لا ، هذه ليست مشكلة على الإطلاق ، لا سيما على مستويات قراءة الإنسان مثل لك.

دعونا ننظر إلى الحدود ، على الرغم من.رمز مثل هذا:

public class Foo {
  public Foo(Foo f) {}
  public static void main(String[] args) {
    new Foo(new Foo(new Foo(new Foo(null))));
  }
}

يجمع في:

public static void main(java.lang.String[]);
Code:
   0: new           #2                  // class Foo
   3: dup           
   4: new           #2                  // class Foo
   7: dup           
   8: new           #2                  // class Foo
  11: dup           
  12: new           #2                  // class Foo
  15: dup           
  16: aconst_null   
  17: invokespecial #3                  // Method "<init>":(LFoo;)V
  20: invokespecial #3                  // Method "<init>":(LFoo;)V
  23: invokespecial #3                  // Method "<init>":(LFoo;)V
  26: invokespecial #3                  // Method "<init>":(LFoo;)V
  29: pop           
  30: return     

أي.لكل تداخل ، فإنه يستخدم فقط عنصرين أو أكثر في مكدس المعامل:الطبقة لإنشاء مثيل ، الكائن المتداخل ، وأي متغيرات أخرى مرت معها.

الحد الأقصى لحجم كومة المعامل هو تنفيذ محددة, ، ولكن أي جفم سيكون بالتأكيد قادرا على الاحتفاظ بعدة آلاف من المتغيرات والعمل عليها بكفاءة.للمقارنة, javac تعطل بعد 1000 فقط التعشيش.

لذلك لا ، لديك أربعة مستوى التعشيش العميق على الإطلاق أي مشكلة ل جفم.

نصائح أخرى

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

إذا كنت ترغب في الترفيه عن الحدود فقط من أجل المتعة منه، وأعتقد أن الحد الأقصى الأول الذي ستفعله في الواقع هو الحد الأقصى على طول بطولة BYTECODE من طريقة واحدة، والتي تم تعيينها عند 64 كيلو بايت منخفضة للغاية.

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

يحتوي المترجم على قيود تبلغ 64 كيلو بايت لطريقة واحدة.يولد هذا من حقيقة أن القفزة يمكن أن تذهب فقط إلى موضع رمز البايت الغزاء ويستخدم قيمة غير موقعة 16 بت.ينطبق القيد حتى لو لم يكن لديك مثل هذه القفز.

هذا له عواقب مفاجئة.على الرغم من أنك قد لا ترغب في الحصول على الآلاف من الكائنات المتداخلة المحددة بهذه الطريقة، فقد يكون لديك فئة تم إنشاؤها مع القول الآلاف من قيم Enum.يتم إنشاء هذه القيم في طريقة مهيأة ثابتة واحدة وهذا يحتوي أيضا على نفس القيد، حتى تتمكن من الحصول على قيم ENR 3K فقط.

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

حجم ذاكرة الكومة الخاصة بك. عند الحصول على هذه الذاكرة ممتلئة أو لا يمكن لجهاز GC جمع الكائنات، فإنه يلقي java.lang.outofmemoryerror

طالما لديك ذاكرة، فهي ليست مشكلة

حقا، هذا لا يختلف عن الكتابة:

giveacodicetagpre.

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

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

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