Domanda

Ho una classe innestata statica, che vorrei tornare tramite una funzione di accesso statica (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
    }
}

Lo so perché questo non funziona, perché le colonne è una classe, e non una variabile, invece, per altre ragioni, ho bisogno di mantenere le colonne come una classe statica. Non sono nemmeno sicuro se questo fattibile, ma voglio solo chiedere se c'era?

Grazie!

È stato utile?

Soluzione

Bene, se la classe innestata statica è pubblico, come nel tuo esempio, mi chiedo il motivo per cui si desidera creare una funzione di accesso, mentre è possibile accedere direttamente alla classe annidata.

Altri suggerimenti

Hai ancora bisogno di creare un'istanza della classe, come:

 return new Columns();

Se le colonne non era statica e volete creare un'istanza da qualche altra parte sarebbe necessaria un'istanza della classe esterna

return new SomeClass().new Columns();

Con la soluzione che si può fare:

return new SomeClass.Columns();

Vuoi restituire il class Colonna o un'istanza di Colonna

Nel primo caso, è possibile utilizzare

return SomeClass.Columns.class; // SomeClass.Columns can also be accessed directly,
                                // since it is public.

Per questi ultimi, è possibile utilizzare

return new SomeClass.Columns();

Potrebbe aiutare se effettivamente spiegare come la vostra classe Columns deve essere utilizzato. Stai cercando di ottenere un'istanza di esso o stai cercando di ottenere ciò che classe è?

È possibile restituire un'istanza Class per consentire al metodo chiamante da utilizzare newInstance() su di esso:

public static Class<Columns> getColumnEnumerator()
{
    int x = Columns.length;

    return Columns.class;
}

In alternativa si dovrà modificare Columns in qualcosa di simile:

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;
    }
}

Ma da uno dei vostri commenti su "creare una superclasse SomeClass, che restituisce Columns", questo sembra essere un problema di progettazione. Non è possibile sostituire i metodi statici in modo eredità potrebbe rende le cose peggiori.

 public static Columns<?> getColumnEnumerator()

Questo significa che è necessario restituire un'istanza di colonne.

Come su

 return new Columns();

o, se si desidera che la stessa istanza per tutto il tempo

 return Columns.privateSingletonInstance;  // from a static field
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top