0

我有一个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.

4

1 回答 1

0

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

    enum White implements Node {
        INSTANCE;

        public Node foo() {
            return new Outer().new Black(); // This will work
        }
    }
于 2013-02-26T09:04:02.613 回答