سؤال

كنت أبحث في جافا البرمجية LinkedList و لاحظت أنه استخدم ثابت متداخلة الصف ، Entry.

public class LinkedList<E> ... {
...

 private static class Entry<E> { ... }

}

ما هو سبب استخدام ثابت متداخلة الصف بدلا من العادي الداخلية الفصل ؟

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

ولكن أعتقد أنه قد يكون هناك أسباب أخرى ربما الأداء.ما قد يكون ؟

ملاحظة.أرجو أن أكون قد حصلت على شروط الصحيح ، كنت قد دعا ذلك ثابت الطبقة الداخلية ، ولكن أعتقد أن هذا هو الخطأ: http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html

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

المحلول

الشمس الصفحة رابط لديها بعض الاختلافات الرئيسية بين اثنين:

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

ملاحظة:ثابت متداخلة الدرجة يتفاعل مع أعضاء مثيل الخارجي الفئة (فئات أخرى) تماما مثل أي دولة أخرى على مستوى أعلى فئة. في الواقع ثابت متداخلة فئة سلوكيا مستوى أعلى من الدرجة التي تم تضمينه في آخر مستوى أعلى فئة التعبئة والتغليف الراحة.

ليست هناك حاجة LinkedList.Entry إلى أعلى مستوى الدرجة كما هو فقط المستخدمة من قبل LinkedList (هناك بعض الواجهات الأخرى التي لها أيضا ثابت الطبقات المتداخلة اسمه Entry, مثل Map.Entry - المفهوم نفسه).وبما أنها لا تحتاج إلى الوصول إلى LinkedList أعضاء ، فمن المنطقي أن يكون ثابت - هو أنظف بكثير النهج.

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

نصائح أخرى

لرأيي، يجب السؤال لتكون وسيلة جولة أخرى كلما رأيت الطبقة الداخلية - يفعل <م> حقا بحاجة إلى أن تكون الطبقة الداخلية، مع تعقيد إضافي والضمني (بدلا من صريحة واضحة، IMO) إشارة إلى مثيل الطبقة التي تحتوي على؟

والعقل لك، أنا منحاز باعتباره C # مروحة - لايوجد C # ما يعادل الطبقات الداخلية، على الرغم من أنه لا توجد لديها أنواع المتداخلة. لا أستطيع أن أقول لقد غاب الطبقات الداخلية بعد:)

وهناك غير واضحة القضايا الاحتفاظ ذاكرة أن تأخذ في الاعتبار هنا. منذ الطبقة الداخلية غير ثابت يحافظ على إشارة ضمنية إلى أنه في الفئة 'الخارجية'، إذا المشار إليها مثيل الطبقة الداخلية بقوة، ثم المقام الخارجي المشار إليها بقوة أيضا. وهذا يمكن أن يؤدي إلى بعض الرأس للخدش عند الطبقة الخارجية ليست القمامة التي تم جمعها، على الرغم من أن <م> يبدو أن لا شيء يحيل الى ذلك.

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

وكقاعدة عامة، وأود أن أقول، إذا قمت بتعريف فئة التي في الأساس هناك ليكون بمثابة مجموعة من أعضاء البيانات، مثل "البنية" في C، والنظر في جعله ثابت.

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

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

على سبيل المثال لمثل هذا النوع من الاستخدام ، يمكنك أن تجد في الروبوت R.java (الموارد) الملف.Res المجلد الروبوت يحتوي على تخطيطات (التي تحتوي على شاشة التصاميم), مجلد drawable (التي تحتوي على الصور المستخدمة في المشروع) ، القيم المجلد (الذي يحتوي على سلسلة الثوابت) ، الخ.

شرط جميع المجلدات هي جزء من مجلد Res, الروبوت أداة يولد R.java (الموارد) الملف الذي داخليا يحتوي على الكثير من ساكنة الطبقات المتداخلة لكل من داخل المجلدات.

هنا هو نظرة ويشعر من R.java الملفات التي تم إنشاؤها في الروبوت: ها هم فقط باستخدام التعبئة والتغليف الراحة.

/* AUTO-GENERATED FILE.  DO NOT MODIFY.
 *
 * This class was automatically generated by the
 * aapt tool from the resource data it found.  It
 * should not be modified by hand.
 */

package com.techpalle.b17_testthird;

public final class R {
    public static final class drawable {
        public static final int ic_launcher=0x7f020000;
    }
    public static final class layout {
        public static final int activity_main=0x7f030000;
    }
    public static final class menu {
        public static final int main=0x7f070000;
    }
    public static final class string {
        public static final int action_settings=0x7f050001;
        public static final int app_name=0x7f050000;
        public static final int hello_world=0x7f050002;
    }
}

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

class OuterClass {
    private OuterClass(int x) {
        System.out.println("x: " + x);
    }

    static class InnerClass {
        public static void test() {
            OuterClass outer = new OuterClass(1);
        }
    }
}

public class Test {
    public static void main(String[] args) {
        OuterClass.InnerClass.test();
        // OuterClass outer = new OuterClass(1); // It is not possible to create outer instance from outside.
    }
}

وهذا الناتج x:1

http://docs.oracle.com/javase/tutorial /java/javaOO/whentouse.html :

<اقتباس فقرة>   

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

ومثال بسيط:

package test;

public class UpperClass {
public static class StaticInnerClass {}

public class InnerClass {}

public static void main(String[] args) {
    // works
    StaticInnerClass stat = new StaticInnerClass();
    // doesn't compile
    InnerClass inner = new InnerClass();
}
}

إذا غير ثابت الطبقة لا يمكن إنشاء مثيل إلا في مثيل من الطبقة العليا (ليست في المثال حيث الرئيسي هو وظيفة ثابتة)

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

وPS: لقد فهم دائما "متداخلة" و "الداخلية" لتكون قابلة للتبديل. قد تكون هناك الفروق الدقيقة في شروط بيد أن معظم مطوري جافا فهم إما.

يمكن غير الطبقات الداخلية ثابتة يؤدي إلى تسرب الذاكرة بينما الطبقة الداخلية ثابتة ستحمي ضدهم. إذا كانت الطبقة الخارجية يحمل بيانات كبيرة، يمكن أن تقلل من أداء التطبيق.

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

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

<ع> استخدام فئة المتداخلة ثابتة بدلا من واحدة غير ثابت قد حفظ المسافات في بعض الحالات. على سبيل المثال: تنفيذ Comparator داخل الطبقة، ويقول الطالب

.
public class Student {
  public static final Comparator<Student> BY_NAME = new ByName();
  private final String name;
  ...
  private static class ByName implements Comparator<Student> {
    public int compare() {...}
  }
}

وثم يضمن static أن الطبقة الطالب قد المقارنة واحد فقط، بدلا من مثيل واحد جديد في كل مرة يتم إنشاء مثيل طالب جديد.

Adavantage من الطبقة الداخلية--

  1. استخدام مرة واحدة
  2. يدعم ويحسن التغليف
  3. readibility
  4. خاصة مجال الوصول

دون الموجودة الخارجي فئة الطبقة الداخلية لا وجود لها.

class car{
    class wheel{

    }
}

هناك أربعة أنواع من الطبقة الداخلية.

  1. عادي الطبقة الداخلية
  2. طريقة الطبقة الداخلية المحلية
  3. الطبقة الداخلية من مجهول
  4. ثابت الطبقة الداخلية

نقطة ---

  1. من ساكنة الطبقة الداخلية ,نحن يمكن فقط الوصول إلى ثابت عضو الخارجي الدرجة.
  2. داخل الطبقة الداخلية ونحن cananot أعلن عضو ثابت .
  3. اتباعها الاحتجاج العادي الطبقة الداخلية في منطقة ثابتة الخارجي الدرجة.

    Outer 0=new Outer(); Outer.Inner i= O.new Inner();

  4. اتباعها الاحتجاج العادي الطبقة الداخلية في المثال المجال الخارجي الدرجة.

    Inner i=new Inner();

  5. اتباعها الاحتجاج العادي الطبقة الداخلية في خارج الخارجي الدرجة.

    Outer 0=new Outer(); Outer.Inner i= O.new Inner();

  6. داخل الطبقة الداخلية من هذا المؤشر إلى الطبقة الداخلية.

    this.member-current inner class outerclassname.this--outer class

  7. على الطبقة الداخلية المطبقة التعديل هو-الجمهور الافتراضي ،

    final,abstract,strictfp,+private,protected,static

  8. الخارجي$الداخلية هو اسم الطبقة الداخلية من اسم.

  9. الطبقة الداخلية من الداخل سبيل المثال الطريقة ثم يمكننا أن رصا ثابت سبيل المثال المجال الخارجي الدرجة.

10.الطبقة الداخلية داخل أسلوب ثابت ثم نحن يمكن فقط الوصول ثابتة مجال

الخارجي الدرجة.

class outer{

    int x=10;
    static int y-20;

    public void m1() {
        int i=30;
        final j=40;

        class inner{

            public void m2() {
                // have accees x,y and j
            }
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top