Java从内部类单例中访问外部类变量
我有一个接口(Node
),它由两个类实现:White
(我想成为单例)和Black
(不是单例)。问题是我希望这些类被一个外部类(Outer
)包围,该外部类具有其自己的字段(outerObject
)。 White
应该是单身,这意味着它应该是静态的。但Black
需要能够访问外部类字段,这意味着它不能是静态的。Java从内部类单例中访问外部类变量
这里,如果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
。
你可以指定外部你想创建新的黑色的实例。但可能这不是你想要的。
enum White implements Node {
INSTANCE;
public Node foo() {
return new Outer().new Black(); // This will work
}
}
我以前见过这个,但是我需要新的'Black'与'White'包含相同的'Outer'。如果'White'是静态的,我知道这是不可能的。也许还有另外一种单例模式的非静态实现。 – Hau 2013-02-26 09:10:00
我认为你可能是过于复杂的事情。为什么你甚至需要这样的结构? – 2013-02-26 08:57:46
defence除了改变你的设计,没有办法绕过这个。静态内部类不绑定到外部类的特定实例,因此它不能创建非静态内部类的实例,因为**被绑定到特定的外部实例。 – 2013-02-26 09:00:04
感谢您的快速回复! 我想实现一个四叉树。 编辑:四叉树存储点和线作为内容。 '白色'节点意味着什么都没有。 '黑色'节点意味着它有一个点。还有'Grey'节点,但为了清楚起见,我将它们排除在问题之外。 – Hau 2013-02-26 09:01:42