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