0

Node2 つのクラスによって実装されているインターフェイス ( ) があります:Whiteシングルトンにしたい と、シングルトンではありBlackません。Outer問題は、これらのクラスを、独自のフィールド ( ) を持つ外部クラス ( ) で囲む必要があることですouterObjectWhiteシングルトンにする必要があります。つまり、静的にする必要があります。ただし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囲むことなくnew をインスタンス化することはできません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必要がありますが、シングルトンにするためには静的にする必要があります。

これに対する解決策があるかどうか誰かが知っていますか? 結局のところ、疑似シングルトンの内部クラスを作成することもできます (外部クラスの各インスタンスは、その内部クラスのインスタンスを 1 つしか持てないという意味で)。または、シングルトン パターンを捨てて、手動で 1 つだけ宣言しWhiteます。

4

1 に答える 1

0

新しいブラックを作成するアウターのインスタンスを指定できます。しかし、おそらくそれはあなたが望むものではありません。

    enum White implements Node {
        INSTANCE;

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