كيف يمكنني الوصول بشكل صحيح ثابت عضو الطبقات ؟

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

  •  01-07-2019
  •  | 
  •  

سؤال

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

هذا هو حيث يمكن أن يكون غير متطابقة الحالات مع نفس الاسم.

Class A 
{
    public static package1.Foo foo;
}

Class B 
{
    public static package2.Foo foo;
}


//package1
Foo 
{
    public final static int bar = 1;
}

// package2
Foo
{
    public final static int bar = 2;
}

// usage
assertEquals(A.foo.bar, 1);
assertEquals(B.foo.bar, 2);

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

أنا أدرك أنني يمكن الوصول إلى ثابت الحالات مباشرة ، ولكن إذا كان لديك طويلة حزمة الهرمي ، أن يحصل على القبيح:

assertEquals(net.FooCorp.divisions.A.package.Foo.bar, 1);
assertEquals(net.FooCorp.divisions.B.package.Foo.bar, 2);
هل كانت مفيدة؟

المحلول

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

public class A {
    public static class Foo extends package1.Foo {}
}
public class B {
    public static class Foo extends package2.Foo {}
}

نصائح أخرى

يجب عليك استخدام:

Foo.bar

و لا:

A.foo.bar

هذا ما التحذير يعني.

والسبب هو أن bar ليست عضوا سبيل المثال من Foo.بدلا من ذلك ، bar عالمي, في الصف Foo.المترجم يريد أن مرجع ذلك عالميا بدلا من التظاهر هو عضو سبيل المثال.

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

package1.Foo.bar
package2.Foo.bar

بمجرد إنشاء الكائن في:

public static package1.Foo foo;

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

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

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