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