Java: retour classe imbriquée statique
-
22-09-2019 - |
Question
J'ai une classe imbriquée statique, que je voudrais revenir par un accesseur statique (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
}
}
Je sais pourquoi cela ne fonctionne pas, parce que les colonnes est une classe, et non une variable, mais, pour d'autres raisons, je dois garder des colonnes en tant que classe statique. Je ne suis même pas sûr si cela est faisable, mais veux juste demander s'il y avait?
Merci!
La solution
Eh bien, si votre classe imbriquée statique est public, comme dans votre exemple, je me demande pourquoi vous voulez créer un accesseur alors que vous pouvez accéder directement à la classe imbriquée.
Autres conseils
Vous devez toujours instancier la classe, comme:
return new Columns();
Si des colonnes était pas statique et que vous souhaitez instancier d'ailleurs il faudrait une instance de la classe externe
return new SomeClass().new Columns();
Avec votre solution, vous pouvez faire:
return new SomeClass.Columns();
Voulez-vous retourner le class colonne ou une instance de colonne ?
Pour la première, vous pouvez utiliser
return SomeClass.Columns.class; // SomeClass.Columns can also be accessed directly,
// since it is public.
Pour ce dernier, vous pouvez utiliser
return new SomeClass.Columns();
Il peut être utile si vous expliquer réellement comment votre classe Columns
doit être utilisé. Essayez-vous d'obtenir une instance ou que vous essayez d'obtenir quelle classe il est?
Vous pouvez retourner une instance de Class
pour permettre à votre méthode d'appel à utiliser newInstance()
dessus:
public static Class<Columns> getColumnEnumerator()
{
int x = Columns.length;
return Columns.class;
}
Ou vous devrez modifier Columns
en quelque chose comme:
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;
}
}
Mais l'un de vos commentaires sur « créer une superclasse pour SomeClass
, qui retourne Columns
», cela semble être un problème de conception. Vous ne pouvez pas remplacer les méthodes statiques si l'héritage pourrait fait qu'empirer les choses.
public static Columns<?> getColumnEnumerator()
Cela signifie que vous devez retourner une instance de colonnes.
Qu'en est-
return new Columns();
ou, si vous voulez la même instance tout le temps
return Columns.privateSingletonInstance; // from a static field