Java: tornare classe innestata statica
-
22-09-2019 - |
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!
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