لماذا ثابت متداخلة واجهة استخدامها في جافا ؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

لقد وجدت ثابت متداخلة واجهة في رمز قاعدة.

class Foo {
    public static interface Bar {
        /* snip */
    }
    /* snip */
}

أنا لم أر هذا من قبل.المطور الأصلي هو بعيد المنال.ولذلك يجب أن أطلب ذلك:

ما هي دلالات وراء ساكنة واجهة ؟ ما من شأنه تغيير, إذا كنت إزالة static?لماذا أي شخص فعل هذا ؟

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

المحلول

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

وفي كلتا الحالتين, المطور هو مجرد إعلان واجهة اسمه فو.بار.لا يوجد مزيد من الشراكة مع أرفق الدرجة, إلا أن التعليمات البرمجية التي لا يمكن الوصول فو لن تكون قادرة على الوصول فو.بار أيضا.(من شفرة المصدر - بايت كود أو انعكاس يمكن الوصول فو.شريط حتى لو فو هو حزمة خاصة!)

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

public class Foo {
    public interface Bar {
        void callback();
    }
    public static void registerCallback(Bar bar) {...}
}
// ...elsewhere...
Foo.registerCallback(new Foo.Bar() {
    public void callback() {...}
});

نصائح أخرى

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

الأعضاء واجهات ضمنا ثابت.المعدل ثابتة في المثال الخاص بك يمكن إزالتها دون تغيير دلالات رمز.انظر أيضا لغة جافا مواصفات 8.5.1.عضو ثابت نوع الإعلانات

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

public class Baz implements Foo.Bar {
   ...
}

في معظم الطرق ، هذه ليست مختلفة عن ثابت الطبقة الداخلية.

جيسي الجواب قريب ، ولكن أعتقد أن هناك أفضل رمز تبين سبب داخلي واجهة قد تكون مفيدة.والنظر في التعليمات البرمجية أدناه قبل أن تقرأ على.يمكنك أن تجد السبب الداخلي واجهة مفيدة ؟ الجواب هو أن الطبقة DoSomethingAlready يمكن إنشاء مثيل مع أي الفئة التي تطبق A و C;وليس فقط فئة محددة حديقة الحيوان.بالطبع, هذا لا يمكن أن يتحقق حتى لو AC ليست الداخلي ، ولكن تخيل وصل أسماء أطول (ليس فقط A و C) ، أفعل هذا من أجل مجموعات أخرى (مثلا ، A و B ، C ، B ، إلخ.) وأنت ترى بسهولة كيف تسير الأمور خارج السيطرة.ناهيك عن أن الناس مراجعة المصدر شجرة سوف تطغى الواجهات التي هي ذات مغزى فقط في فئة واحدة.لتلخيص ذلك ، داخلي واجهة تمكن من بناء العرف أنواع ويحسن التغليف.

class ConcreteA implements A {
 :
}

class ConcreteB implements B {
 :
}

class ConcreteC implements C {
 :
}

class Zoo implements A, C {
 :
}

class DoSomethingAlready {
  interface AC extends A, C { }

  private final AC ac;

  DoSomethingAlready(AC ac) {
    this.ac = ac;
  }
}

للإجابة على سؤالك مباشرة جدا ، أنظر الخريطة.الدخول.

خريطة.دخول

أيضا قد يكون هذا مفيدا

ثابت متداخلة Inerfaces بلوق الدخول

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

إذا كان يمكنك تغيير فئة فو في واجهة فو "الجمهور" الكلمة في المثال أعلاه سيتم أيضا زائدة وكذلك بسبب

واجهة محددة داخل واجهة أخرى سوف ضمنا العامة ساكنة.

في عام 1998 ، فيليب Wadler اقترح فرق بين ساكنة واجهات غير ثابت الواجهات.

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

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

مثال على الفرق بين ثابت وغير ثابت متداخلة واجهات يمكن أن ينظر إليه في له نموذج التعليمات البرمجية:

// This code does NOT compile
class LangF<This extends LangF<This>> {
    interface Visitor<R> {
        public R forNum(int n);
    }

    interface Exp {
        // since Exp is non-static, it can refer to the type bound to This
        public <R> R visit(This.Visitor<R> v);
    }
}

اقتراحه لم جعلت في جافا 1.5.0.ومن ثم جميع إجابات أخرى صحيحة:لا يوجد فرق ثابتة وغير ثابتة متداخلة الواجهات.

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

class Bob
{
  void FuncA ()
  {
    Foo.Bar foobar;
  }
}

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

وصف أنواع فئة في جافا.

ثابت يعني أن أي فئة جزءا من حزمة(المشروع) يمكن أن الق بدون استخدام المؤشر.هذا يمكن أن تكون مفيدة أو عرقلة اعتمادا على الوضع.

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

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

أساليب ثابتة جيدة لمرة واحدة عوائد حسابات سريعة أو سهلة الحصول عليها من البيانات.

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