【发布时间】:2013-02-26 08:56:15
【问题描述】:
我有一个由两个类实现的接口 (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 设为静态单例,那么它无法在没有封闭Outer 的情况下实例化新的Black:
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;
}
}
捕获相同问题的更简单表示是尝试从单例White 访问outerObject:
class Outer {
enum White {
INSTANCE;
Node foo() {
outerObject.doSomething();
return this;
}
}
Object outerObject;
}
我必须将White 设为非静态才能访问outerObject,但它应该是静态的才能成为单例。
有谁知道这个问题有没有解决办法?如果归根结底,我可以尝试制作一个伪单例内部类(在某种意义上,外部类的每个实例只能具有该内部类的一个实例)。或者干脆放弃单例模式并手动声明一个White。
【问题讨论】:
-
我认为你可能把事情复杂化了。为什么还需要这样的结构?
-
防御除了改变你的设计之外没有其他办法。静态内部类不绑定到外部类的特定实例,因此它不能创建非静态内部类的实例,因为 绑定到特定外部实例。
-
感谢您的快速回复!我正在尝试实现四叉树。编辑:四叉树将点和线存储为内容。
White节点表示其中没有任何内容。Black节点表示其中有一个点。还有Grey节点,但为了清楚起见,我将它们排除在外。