جافا: عودة الطبقة المتداخلة الثابتة
-
22-09-2019 - |
سؤال
لدي فئة متداخلة ثابتة ، والتي أود العودة عبر ملحق ثابت (getter).
public class SomeClass
{
public static class Columns<CC>
{
...
public static int length = 5;
}
public static Columns<?> getColumnEnumerator()
{
int x = Columns.length; //no problems
return Columns; //compiler error
//cannot find symbol: variable Columns location: blah.blah.SomeClass
}
}
أعلم لماذا هذا لا يعمل ، لأن الأعمدة هي فئة ، وليس متغيرًا ، لأسباب أخرى ، أحتاج إلى الحفاظ على الأعمدة كفئة ثابتة. لست متأكدًا مما إذا كان هذا ممكنًا ، لكن أريد فقط أن أسأل عما إذا كان هناك؟
شكرًا!
المحلول
حسنًا ، إذا كان الفصل المتداخل الثابت الخاص بك علنيًا ، كما هو الحال في مثالك ، أتساءل عن سبب رغبتك في إنشاء ملحق بينما يمكنك الوصول مباشرة إلى الفصل المتداخل.
نصائح أخرى
لا تزال بحاجة إلى إنشاء إنشاء الفصل ، مثل:
return new Columns();
إذا لم تكن الأعمدة ثابتة وترغب في إنشاء مثيل لها من مكان آخر ، فسوف يتطلب مثيلًا للفئة الخارجية
return new SomeClass().new Columns();
مع الحل الخاص بك يمكنك القيام به:
return new SomeClass.Columns();
هل تريد إعادة صف دراسي عمود أو مثال عمود ?
بالنسبة إلى السابق ، يمكنك استخدام
return SomeClass.Columns.class; // SomeClass.Columns can also be accessed directly,
// since it is public.
للأخير ، يمكنك استخدام
return new SomeClass.Columns();
قد يساعد ذلك إذا شرحت بالفعل كيف Columns
الطبقة لاستخدامها. هل تحاول الحصول على مثيل منه أم أنك تحاول الحصول على ما هو الفصل؟
يمكنك إعادة أ Class
مثيل للسماح لأسلوب الاتصال الخاص بك للاستخدام newInstance()
عليه:
public static Class<Columns> getColumnEnumerator()
{
int x = Columns.length;
return Columns.class;
}
أو عليك التعديل Columns
في شيء مثل:
public class SomeClass
{
public static class Columns<CC>
{
public final int LENGTH = 5; // changed to a final, or create an accessor
...
private Columns() { ... } // private constructor
}
public static Columns<?> getColumnEnumerator()
{
Columns columns = new Columns(); // only SomeClass can instantiate this
int x = columns.LENGTH;
return columns;
}
}
ولكن من أحد تعليقاتك حول "إنشاء طبقة فائقة ل SomeClass
, الذي يعود Columns
"، يبدو أن هذه مشكلة في التصميم. لا يمكنك تجاوز الأساليب الثابتة ، لذا فإن الميراث قد يجعل الأمور أسوأ.
public static Columns<?> getColumnEnumerator()
هذا يعني أنك تحتاج إلى إعادة مثيل الأعمدة.
ماذا عن
return new Columns();
أو ، إذا كنت تريد نفس الحالة طوال الوقت
return Columns.privateSingletonInstance; // from a static field