Java从内部类单例访问外部类变量

时间:2013-02-26 08:56:16

标签: java singleton nested

我有一个接口(Node),由两个类实现:White,我想成为单身,Black,而不是单身。问题是我希望这些类被外部类(Outer)包围,它有一个自己的字段(outerObject)。 White应该是单身,这意味着它应该是静态的。但是Black需要能够访问外部类字段,这意味着它不能是静态的。

在这里,如果White不是静态的,那么它实际上不是单身人士:

class Outer {
    interface Node {
        Node foo();
    }

    // I would like the White class to be a singleton class
    class White implements Node {
        Node foo() {
            return new Black();
        }
    }

    class Black implements Node {
        Node foo() {
            outerObject.doSomething();
            return this;
        }
    }

    Object outerObject;
}

但是,如果我将White设为静态单例,则无法在没有封闭Black的情况下实例化新的Outer

    enum White implements Node {
        INSTANCE;

        Node foo() {
            return new Black(); // This doesn't work because Black
                                // needs an enclosing outer class.
        }
    }

如果我要使Black成为静态类,那么它就无法访问外部类中的字段(outerObject):

    static class Black implements Node {
        Node foo() {
            outerObject.doSomething(); // can't access non-static field
            return this;
        }
    }

捕获相同问题的简单表示只是尝试从单个outerObject访问White

class Outer {
    enum White {
        INSTANCE;

        Node foo() {
            outerObject.doSomething();
            return this;
        }
    }

    Object outerObject;
}

我必须使White非静态才能访问outerObject,但它应该是静态的才能成为单身。

有没有人知道是否有解决方案?如果归结为它,我可以尝试创建一个伪单例内部类(在某种意义上,外部类的每个实例只能有一个内部类的实例)。或者只是抛弃单例模式并手动声明只有一个White

1 个答案:

答案 0 :(得分:0)

您可以指定要在哪个Outer实例上创建新Black。但可能不是你想要的。

    enum White implements Node {
        INSTANCE;

        public Node foo() {
            return new Outer().new Black(); // This will work
        }
    }