سؤال

لدي فئة متداخلة ثابتة ، والتي أود العودة عبر ملحق ثابت (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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top