2010-01-22 6 views
2

J'ai une classe statique imbriquée, que je voudrais retourner via un accesseur statique (getter).Java: retourne une classe imbriquée statique

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 que ce soit faisable, mais je veux juste demander s'il y en avait?

Merci!

+0

Veuillez préciser ce que nous essayons d'atteindre ici.Je ne suis pas trop sûr de ce qu'est la question réelle :). –

Répondre

2

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 directement accéder à la classe imbriquée.

+0

@ gizmo, je suis désolé d'avoir laissé cela hors de question, mais j'allais créer une superclasse pour 'SomeClass', qui retourne' Columns', & 'Columns' serait implémenté différemment dans chaque sous-classe. – bguiz

+0

@bguiz: Je pense que nous manquons tous le modèle exact que vous essayez d'atteindre alors. Pourriez-vous être plus précis dans votre question? Donner des cas d'utilisation serait utile. – gizmo

0
public static Columns<?> getColumnEnumerator() 

Cela signifie que vous devez renvoyer une instance de Columns.

Que diriez-vous

return new Columns(); 

ou, si vous voulez la même instance tout le temps

return Columns.privateSingletonInstance; // from a static field 
1

Vous devez toujours instancier la classe, comme:

return new Columns(); 

Si des colonnes était pas statique et que vous voulez à 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(); 
+0

@Kristian, 'Columns' est une classe entièrement statique (tous ses membres sont statiques), donc l'instanciation n'est pas vraiment une option ici. – bguiz

+0

@bguiz, je ne comprends pas vraiment ce que vous essayez d'accomplir ici, les classes statiques et les méthodes statiques sont deux choses différentes ...? – Kristian

1

voulez-vous retourner le classeColonne ou une instance de Colonne?

Pour l'ancien, 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(); 
1

Il pourrait aider si vous expliquer réellement comment votre classe Columns doit être utilisé. Êtes-vous en train d'essayer d'en obtenir une instance ou essayez-vous de savoir de quelle classe il s'agit?

Vous pouvez retourner une instance 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 d'un de vos commentaires à propos de "créer une superclasse pour SomeClass, qui renvoie Columns", cela semble être un problème de conception. Vous ne pouvez pas remplacer les méthodes statiques, l'héritage peut donc empirer les choses.

Questions connexes