我有一類「字符」,字符是非靜態的。我想讓我的玩家類擴展角色,但也是靜態的。Java - 非靜態類的擴展靜態類
我基本上希望所有其他對象和類都能夠訪問播放器,而無需創建並傳遞播放器實例。
什麼是最好的爲什麼要實現這一目標?
我有一類「字符」,字符是非靜態的。我想讓我的玩家類擴展角色,但也是靜態的。Java - 非靜態類的擴展靜態類
我基本上希望所有其他對象和類都能夠訪問播放器,而無需創建並傳遞播放器實例。
什麼是最好的爲什麼要實現這一目標?
我能想到的唯一的好方法實際上不是一個擴展,但包裝:
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()
,並且始終爲您提供相同的對象(您永遠不會創建多個對象)。
在biz中,我們稱之爲'偏愛構圖而非繼承';) – 2011-06-12 05:08:06
嗨,我學到了一個新詞。還添加了非組合解決方案。 – trutheality 2011-06-12 05:20:28
......我沒有閱讀馬克·彼得斯的解決方案,但第三個選項幾乎是它的一個副本。 – trutheality 2011-06-12 05:21:48
真的好像你只是想要一個全局變量。這通常是通過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%的時間我個人喜歡依賴注入而不是全局狀態。當一種方法需要訪問播放器時,請將其傳入。這樣可以讓您更輕鬆地測試代碼,並使代碼更有利於更改。
那些需要訪問玩家的類/對象呢?這樣 - 就像我的GUI需要訪問它一樣,所以我應該只是通過它? – Paramount 2011-06-12 05:16:53
@Paramount這是好事 - 你不需要通過它,他們可以通過'Player.getHuman()'獲得玩家對象' – trutheality 2011-06-12 05:24:03
啊好吧,你可以@trutheality我認爲我現在明白了。謝謝 – Paramount 2011-06-12 05:26:58
不好的想法將您的類命名爲與java.lang.Character類相同 – Bohemian 2011-06-12 04:48:36
非常真實,我將它縮小到包但我想我可能會改變它。 – Paramount 2011-06-12 04:50:05
你確定你明白什麼「靜態」意味着在處理類時?頂級類不能聲明爲靜態,也不能是非靜態的。 – 2011-06-12 04:52:26