Node2 つのクラスによって実装されているインターフェイス ( ) があります: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囲むことなく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ます。