Фабрика во внутреннем классе, не возможно?

1

Мне нравится скрывать детали моего внутреннего класса от моего внешнего класса. Мой внутренний класс должен быть нестационарным для доступа к внешним переменным

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

Должен ли я пересказывать эту функцию и создавать экземпляр внутреннего класса в родительском объекте или передать все родительские переменные во внутреннюю, чтобы получить право на статичность?

  • 1
    «Мой внутренний класс должен быть нестатичным для доступа к внешним переменным» - не совсем верно; Вы можете передать экземпляр внешнего класса в конструктор статического внутреннего класса.
  • 0
    Одна из двух альтернатив отречения, которую я предлагаю в последнем предложении
Показать ещё 4 комментария
Теги:
class
java-8
static
inner-classes

1 ответ

1
Лучший ответ

Я думаю, что два варианта, которые вы наметили (сделайте Inner static или поместите эти заводские методы в Outer), прекрасны, и вы не получите многого, перейдя со следующим, но это вопрос мнения.

Вы можете реплицировать функцию статических методов и переменных с помощью объекта singleton (по отношению к объекту Outer) для их хранения. В этом случае это выглядит примерно так:

class Outer {

    int foo = 0;
    int bar = 5;

    private final InnerFactory innerFactory = new InnerFactory();

    List<Inner> test() {
        Inner fromFoo = innerFactory.newFromFoo();
        Inner fromBar = innerFactory.newFromBar();

        return Arrays.asList(fromFoo, fromBar);
    }

    private class InnerFactory {

        Inner newFromFoo() {
            // I'm an inner class, so I can access member variables 
            // of enclosing Outer
            return new Inner(foo);   
        }

        Inner newFromBar() {
            return new Inner(bar);
        }
    }

    public class Inner {

        int baz;

        Inner(int baz) {
            this.baz = baz;
        }
    }

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню