工厂在内班,不可能吗?

时间:2015-03-25 22:39:49

标签: java class static java-8 inner-classes

我想从外层隐藏内部类的实例化细节。 我的内部类需要是非静态的才能访问外部变量

如果我尝试编写一个buildNew()静态方法,它会抛出一个错误,因为它似乎不可能在内部类中有静态方法。

我是否必须重新声明该功能并在父级中实例化内部类,或者将所有父变量传递给内部以获得静态资格?

1 个答案:

答案 0 :(得分:2)

我认为您概述的两个选项(使内部静态或将这些工厂方法放在外部)都很好,并且通过使用以下内容您没有获得太多收益,但这是一个意见问题。

您可以通过使用单个(关于外部实例)对象来保存它们来复制静态方法和变量的功能。在这种情况下,它看起来像这样:

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

}