2013-02-26 129 views
0

我有一個接口(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

+3

我認爲你可能是過於複雜的事情。爲什麼你甚至需要這樣的結構? – 2013-02-26 08:57:46

+0

defence除了改變你的設計,沒有辦法繞過這個。靜態內部類不綁定到外部類的特定實例,因此它不能創建非靜態內部類的實例,因爲**被綁定到特定的外部實例。 – 2013-02-26 09:00:04

+0

感謝您的快速回復! 我想實現一個四叉樹。 編輯:四叉樹存儲點和線作爲內容。 '白色'節點意味着什麼都沒有。 '黑色'節點意味着它有一個點。還有'Grey'節點,但爲了清楚起見,我將它們排除在問題之外。 – Hau 2013-02-26 09:01:42

回答

0

你可以指定外部你想創建新的黑色的實例。但可能這不是你想要的。

enum White implements Node { 
     INSTANCE; 

     public Node foo() { 
      return new Outer().new Black(); // This will work 
     } 
    } 
+0

我以前見過這個,但是我需要新的'Black'與'White'包含相同的'Outer'。如果'White'是靜態的,我知道這是不可能的。也許還有另外一種單例模式的非靜態實現。 – Hau 2013-02-26 09:10:00