实例化新对象和实现reset()方法的区别

5

我正在使用Java创建一个控制台实现的5张牌扑克游戏。

我有一个名为HandOfCards的类,它将处理单个手牌的过程 - 给玩家发牌、下注和确定赢家。我还有一个名为GameOfPoker的类,它可以容纳多个扑克牌手,代表一局扑克游戏的全部。

我将如下构建GameOfPoker的HandOfPoker实例:

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() 方法似乎更好——因为实例化一个新对象会更加昂贵,需要创建一个新的实例并销毁旧实例。

这里有最佳实践方法吗,还是两种方法之间的区别非常小,所以并不重要?

1个回答

7
通常情况下,创建一个新对象并让垃圾回收器销毁它并不昂贵,除非在一个非常紧密的循环中频繁执行此操作。如果您在游戏中每手牌都执行一次,您将无法测量到差异。
因此,在决定是否实现“reset()”方法时,最好集中精力考虑如何向代码的人类读者表达设计的最合适方式:
- 如果“HandOfPoker”永远不会在多个对象之间共享,那么不使用“reset()”对代码读者来说更清晰,因为他们不需要查看“reset()”内部发生了什么。 - 如果“HandOfPoker”在多个对象之间共享(例如用于显示、持久化等),则最好有一个“reset()”而不是在多个地方设置新对象。

2
此外,重置需要显式重新初始化字段,而新对象的字段已经初始化为 0 / false / null。如果这些值对于新实例来说是好的,手动重置字段可能实际上比创建新对象更昂贵。但是,这是不必要的微观优化,应该避免,即不要考虑它,而是专注于程序逻辑,如本答案中所述。 - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接