我有一个接口(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
。
答案 0 :(得分:0)
您可以指定要在哪个Outer实例上创建新Black。但可能不是你想要的。
enum White implements Node {
INSTANCE;
public Node foo() {
return new Outer().new Black(); // This will work
}
}