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

标签 java oop object software-design

我目前正在用 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() 方法似乎更好 - 因为实例化一个新对象似乎成本更高,因为必须创建一个新实例,而旧实例必须被丢弃。

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

最佳答案

通常,创建一个新对象并让垃圾收集器销毁它并不昂贵,除非这在一个非常紧凑的循环中完成很多次。如果你在一场比赛中每手都这样做一次,你将无法衡量差异。

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

  • 如果 HandOfPoker 永远不会在多个对象之间共享,那么不使用 reset() 对代码的读者来说会更简洁,因为他们不需要查看内部reset() 看看发生了什么。
  • 如果 HandOfPoker 在多个对象之间共享,例如为了显示,为了持久化等,那么最好有一个reset(),而不是在多个地方设置新对象。

关于java - 实例化新对象与实现 reset() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43308499/

相关文章:

java - 如何摆脱 instanceof?

java - 按日期对数据排序

java - 在android中的数据报套接字上发送和接收UDP数据包

c++ - 如何使客户端无法访问命名空间的函数

c++ - 客户端服务器编程 - 写入缓冲区

css - 如何为动态宽度网页嵌入使用可变宽度/高度的 YouTube 视频?

java - 意外复制其他对象的行为

javascript - 'push' 和 'splice' 等方法可以更改 ECMAScript 中的对象引用吗?

java - "Invalid Response"再次选择怎么说? ( java 语)

java - org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper 无法转换为 com.mysql.jdbc.Connection