سؤال

(سؤال جافا)

إذا قمت بالإشارة إلى حقل في فئة داخلية، فهل يؤدي ذلك إلى تبعية دائرية بين الفئة المتضمنة والفئة الداخلية؟

كيف يمكنني تجنب ذلك؟

هنا مثال:

public class Outer {

  private Other o;
  private Inner i;    

  public Outer() {
    o = new Other();

    i = new Inner() {
      public void doSomething() {
        o.foo();
      }
    };

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

المحلول

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

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

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

نصائح أخرى

بناء الجملة الذي تستخدمه في المثال معطل قليلاً ولا يوجد إعلان للفئة أو الواجهة الداخلية.ولكن لا يوجد أي خطأ في مفهوم المثال.في جافا سوف تعمل بشكل جيد.

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

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

(لست متأكدا إذا كان هذا هو ما تسأل عنه ...)

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

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