Pregunta

Tengo una clase anidada estática, que quisiera volver a través de un descriptor de acceso estático (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
    }
}

Yo sé por qué esto no funciona, ya que las columnas es una clase, y no una variable, sin embargo, por otras razones, que necesitan mantener columnas como una clase estática. Ni siquiera estoy seguro de si esto factible, pero sólo quiero preguntar si había?

Gracias!

¿Fue útil?

Solución

Bueno, si su clase anidada estática es público, como en el ejemplo, me pregunto por qué se desea crear un descriptor de acceso mientras que se puede acceder directamente a la clase anidada.

Otros consejos

Usted todavía necesita crear una instancia de la clase, como:

 return new Columns();

Si las columnas no era estático y que le gustaría crear una instancia de alguna parte otra cosa que requeriría una instancia de la clase externa

return new SomeClass().new Columns();

Con su solución que puede hacer:

return new SomeClass.Columns();

¿Quieres devolver el class columna o una instancia de columna

En el primer caso, puede utilizar

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

En este último caso, puede utilizar

return new SomeClass.Columns();

Podría ayudar si en realidad se explica cómo su clase Columns se va a utilizar. ¿Estás tratando de obtener una instancia de ella o estás tratando de conseguir lo que es de clase?

Puede devolver una instancia Class para permitir que su método de llamar a su uso newInstance() en él:

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

    return Columns.class;
}

O vas a tener que modificar Columns en algo como:

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

Pero a partir de uno de sus comentarios acerca de "crear una superclase para SomeClass, que devuelve Columns", esto parece ser un problema de diseño. No se puede reemplazar los métodos estáticos así también la herencia empeora las cosas.

 public static Columns<?> getColumnEnumerator()

Esto significa que se necesita para devolver una instancia de columnas.

¿Qué tal

 return new Columns();

o, si desea que la misma instancia todo el tiempo

 return Columns.privateSingletonInstance;  // from a static field
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top