2011-06-12 101 views
1

我有一類「字符」,字符是非靜態的。我想讓我的玩家類擴展角色,但也是靜態的。Java - 非靜態類的擴展靜態類

我基本上希望所有其他對象和類都能夠訪問播放器,而無需創建並傳遞播放器實例。

什麼是最好的爲什麼要實現這一目標?

+1

不好的想法將您的類命名爲與java.lang.Character類相同 – Bohemian 2011-06-12 04:48:36

+0

非常真實,我將它縮小到包但我想我可能會改變它。 – Paramount 2011-06-12 04:50:05

+1

你確定你明白什麼「靜態」意味着在處理類時?頂級類不能聲明爲靜態,也不能是非靜態的。 – 2011-06-12 04:52:26

回答

3

我能想到的唯一的好方法實際上不是一個擴展,但包裝:

class Player { 
    private final static Charachter me = new Character(); 

    public static doSomething(){ me.doSomething(); } 
} 

當然,你也可以擴展和包裝:

class Player extends Character { 

    private final static Player me = new Player(); 

    // if you don't want anyone creating player objects 
    // make the constructor private: 
    private Player(){ super(); } 

    public void doSomething(){ 
     // stuff 
    } 

    public static void staticDoSomething(){ me.doSomething(); } 
} 

或者,實際上,因爲你目標只是爲了確保有一個玩家對象,您可以忘記將方法設爲靜態,但隱藏構造函數:

class Player extends Character { 

    private static Player thePlayer = null; 

    public static Player getPlayer(){ 
     if(thePlayer == null){ 
      // Create the player 
      thePlayer = new Player(); 
     } 
     // There is a valid player object, so return it. 
     return thePlayer; 
    } 

    // hide the constructor(s) by making them private: 

    private Player(){ super(); } 
} 

確保獲得Player的唯一方法是致電Player.getPlayer(),並且始終爲您提供相同的對象(您永遠不會創建多個對象)。

+0

在biz中,我們稱之爲'偏愛構圖而非繼承';) – 2011-06-12 05:08:06

+0

嗨,我學到了一個新詞。還添加了非組合解決方案。 – trutheality 2011-06-12 05:20:28

+0

......我沒有閱讀馬克·彼得斯的解決方案,但第三個選項幾乎是它的一個副本。 – trutheality 2011-06-12 05:21:48

2

真的好像你只是想要一個全局變量。這通常是通過Singleton模式實現的:

public class Player extends Character { 
    private static final Player humanPlayer = new Player(); 

    private Player() { 
    } 

    public static Player getHuman() { 
     return humanPlayer; 
    } 

    //... 
} 

//... 
Player.getHuman().move(2); 

Player中的這些方法應該很少需要靜態。你只是爲了一點便利而犧牲好設計(無論如何,這可能會讓你感到厭煩)。大約95%的時間我個人喜歡依賴注入而不是全局狀態。當一種方法需要訪問播放器時,請將其傳入。這樣可以讓您更輕鬆地測試代碼,並使代碼更有利於更改。

+0

那些需要訪問玩家的類/對象呢?這樣 - 就像我的GUI需要訪問它一樣,所以我應該只是通過它? – Paramount 2011-06-12 05:16:53

+0

@Paramount這是好事 - 你不需要通過它,他們可以通過'Player.getHuman()'獲得玩家對象' – trutheality 2011-06-12 05:24:03

+0

啊好吧,你可以@trutheality我認爲我現在明白了。謝謝 – Paramount 2011-06-12 05:26:58