Java: вернуть статический вложенный класс - PullRequest
2 голосов
/ 22 января 2010

У меня есть статический вложенный класс, который я хотел бы вернуть через статический метод доступа (геттер).

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

Я знаю, почему это не работает, потому что Columns - это класс, а не переменная, однако по другим причинам мне нужно сохранять столбцы как статический класс. Я даже не уверен, выполнимо ли это, но просто хочу спросить, было ли это?

Спасибо!

Ответы [ 5 ]

2 голосов
/ 22 января 2010

Хорошо, если ваш статический вложенный класс является общедоступным, как в вашем примере, мне интересно, почему вы хотите создать аксессор, в то время как вы можете напрямую получить доступ к вложенному классу.

1 голос
/ 22 января 2010

Это может помочь, если вы действительно объясните, как будет использоваться ваш класс Columns. Вы пытаетесь получить экземпляр этого или вы пытаетесь получить, какой это класс?

Вы можете вернуть Class экземпляр, чтобы разрешить вызывающему методу использовать newInstance() на нем:

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

    return Columns.class;
}

Или вам придется изменить Columns на что-то вроде:

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

Но из одного из ваших комментариев о "создании суперкласса для SomeClass, который возвращает Columns", похоже, это проблема дизайна. Вы не можете переопределить статические методы, поэтому наследование может ухудшить ситуацию.

1 голос
/ 22 января 2010

Хотите вернуть класс Столбец или экземпляр Столбец ?

Для первого вы можете использовать

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

Для последнего вы можете использовать

return new SomeClass.Columns();
1 голос
/ 22 января 2010

Вам все еще нужно создать экземпляр класса, например:

 return new Columns();

Если столбцы не являются статичными, и вы хотите создать экземпляр из другого места, для этого потребуется экземпляр внешнего класса

return new SomeClass().new Columns();

С вашим решением вы можете сделать:

return new SomeClass.Columns();
0 голосов
/ 22 января 2010
 public static Columns<?> getColumnEnumerator()

Это означает, что вам нужно вернуть экземпляр Columns.

Как насчет

 return new Columns();

или, если вы хотите один и тот же экземпляр все время

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