【问题标题】:Factory in inner class, not possible?内部类的工厂,不可能吗?
【发布时间】:2015-05-29 20:16:05
【问题描述】:

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

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

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

【问题讨论】:

  • “我的内部类需要是非静态的才能访问外部的变量”——不完全正确;您可以将外部类的实例传递给静态内部类的构造函数。
  • 我在最后一句话中建议的两种放弃选择之一
  • 哦,好吧 - 我不太明白“所有父母的变量”可能意味着什么,所以我没有意识到。
  • 感谢您的帮助,确实是一个非常有用的观点,只是我很挑剔:p
  • 我认为“隐藏”任何东西和“使用内部类”是矛盾的。毕竟,外部类甚至可以调用内部类的private 构造函数。如果你想要真正的封装,你不应该使用内部类……

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


【解决方案1】:

我认为您概述的两个选项(使 Inner 静态或将那些工厂方法放在 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;
        }
    }

}

【讨论】:

    猜你喜欢
    • 2013-02-24
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多