2017-04-09 28 views
3

我目前正在創建一個使用Java的5張牌抽獎撲克遊戲的控制檯實現。實例化新對象與實現重置()方法

我有一個名爲HandOfCards的類,它將處理個人手牌的處理過程 - 處理玩家的牌,投注和確定贏家。我還有一個名爲GameOfPoker的課程,它有助於多手牌,代表撲克遊戲的完整座標。

我將建HandOfPoker實例GameOfPoker這樣:

HandOfPoker handOfPoker = new HandOfPoker(List<PokerPlayer> players, DeckOfCards deck); 

我的問題是,在GameOfPoker我應該實例化新的對象或者應該限定在HandOfPoker復位方法:

public class HandOfPoker{  
    public void reset(List<PokerPlayer> players) { 
    this.players = players; 
    } 
} 

public class GameOfPoker{ 
    public play() { 
    // carry out game 
    // then after a hand, I could either instantiate: 
    //handOfPoker = new HandOfPoker(players, deck); 
    // or I could reset: 
    handOfPoker.reset(); 
    // now I'm ready to play another hand. 
    } 
} 

直覺上,它看起來像reset()方法似乎更好 - 因爲實例化新對象看起來成本更高,因爲必須創建新實例,而舊對象必須被刪除。

這裏有最佳實踐方法,還是兩種方法之間的差異足夠小以致它並不重要?

回答

6

通常情況下,創建一個新對象並讓垃圾收集器銷燬它並不昂貴,除非在非常嚴格的循環中這樣做很多次。如果你在比賽中每手拿到一次,你將無法衡量差異。

因此,最好把注意力集中在最合理的方式來表達你的設計,你的代碼的人看懂,而決定是否應該實施reset()方法或不:

  • 如果HandOfPoker從未在多個共享不使用reset()的對象對於您的代碼的讀者來說具有更清潔的外觀,因爲它們不需要查看reset()以查看發生了什麼。
  • 如果HandOfPoker在多個對象之間共享,例如,用於顯示持久性等,則最好有reset()而不是在多個地方設置新對象。
+1

此外,重置需要顯式重新初始化字段,而新對象的字段已經初始化爲'0'/'false' /'null'。如果這些值適合新實例,那麼手動重置字段可能會更加昂貴,而不是創建新對象。但是,這是不必要的微觀優化,應該避免,也就是說不要考慮它,而應該把注意力集中在程序邏輯上,正如在這個答案中所說的那樣。 – Andreas