实例化新对象与实现reset()方法

scr*_*eeb 3 java oop software-design object

我目前正在用Java创建一个5张牌抽奖扑克游戏的控制台实现.

我有一个名为HandOfCards的课程,它将处理个人手牌的程序 - 交易玩家的牌,下注并确定获胜者.我还有一个名为GameOfPoker的课程,它可以帮助多人扑克,代表一场扑克游戏.

我将为GameOfPoker构造HandOfPoker实例:

HandOfPoker handOfPoker = new HandOfPoker(List<PokerPlayer> players, DeckOfCards deck);
Run Code Online (Sandbox Code Playgroud)

我的问题是,在GameOfPoker中,我应该实例化一个新对象,还是应该在HandOfPoker中定义一个reset方法:

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.
  }
}
Run Code Online (Sandbox Code Playgroud)

直观地说,感觉就像reset()方法看起来更好 - 因为实例化一个新对象似乎更昂贵,因为必须创建一个新实例,而旧的实例必须被删除.

这里是否有最佳实践方法,或两种方法之间的差异是否足够小以至于无关紧要?

das*_*ght 7

通常,创建一个新对象并让垃圾收集器销毁它并不昂贵,除非在非常紧密的循环中多次完成.如果你在游戏中每手一次,那么你将无法衡量差异.

因此,在决定是否应该实现reset()方法时,最好将注意力集中在以最合乎逻辑的方式向人类读者表达您的设计:

  • 如果HandOfPoker永远不会在多个对象之间共享,那么不使用reset()代码的读者可以获得更清晰的外观,因为他们不需要查看内部reset()以查看正在发生的事情.
  • 如果HandOfPoker在多个对象之间共享,例如用于显示,用于持久性等,那么最好是reset()在多个位置设置新对象而不是设置新对象.

  • 另外,重置需要显式重新初始化字段,而新对象的字段已被初始化为0 / false / null。如果这些值适合新实例,则手动重置字段实际上可能比仅创建一个新对象要昂贵得多。但是,这是不必要的微优化,应该避免,即不考虑它,而应将注意力集中在程序逻辑上,如该答案中已经提到的那样。 (2认同)