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!

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top