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