我有一個接口(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
。
我認爲你可能是過於複雜的事情。爲什麼你甚至需要這樣的結構? – 2013-02-26 08:57:46
defence除了改變你的設計,沒有辦法繞過這個。靜態內部類不綁定到外部類的特定實例,因此它不能創建非靜態內部類的實例,因爲**被綁定到特定的外部實例。 – 2013-02-26 09:00:04
感謝您的快速回復! 我想實現一個四叉樹。 編輯:四叉樹存儲點和線作爲內容。 '白色'節點意味着什麼都沒有。 '黑色'節點意味着它有一個點。還有'Grey'節點,但爲了清楚起見,我將它們排除在問題之外。 – Hau 2013-02-26 09:01:42