【问题标题】:Java - Object reference or identifier?Java - 对象引用或标识符?
【发布时间】:2011-09-29 11:07:03
【问题描述】:

我目前正在创建一个大型项目,因此我希望一切顺利且尽可能高效。

在我的项目中,我有一个名为 Teams 的类,其中包含 Team 对象的 HashMap(Integer, Team)。每个 Team 实例都有一个唯一的 ID(整数)。

还有一个叫做 Player 的对象。每个 Player 实例都可以分配给一个团队(但并非总是如此)。

现在,我想知道知道玩家被分配到哪个团队的最佳方法是:

-> 将队伍的ID存储在Player中(private int team),然后用这个ID从Teams中的HashMap中获取队伍。

-> 在 Player(私人团队)中存储对团队的引用

有谁知道哪个更好,最重要的优点、缺点和危险是什么?

谢谢!

【问题讨论】:

  • 这完全取决于您的用例。与其孤立地设计类,不如尝试设计垂直的功能切片。

标签: java


【解决方案1】:

使用私人团队!除非有充分的理由,否则其他类不需要知道对象的 ID。不要在 Java 中实现数据库结构。 Java 被设计为基于对象的,以这种方式使用它。

您应该持有 Team 实例还有几个其他原因:

  1. 我们可以假设您的 Player 需要访问 Team 对象。最好有实例而不是进行查找。
  2. 如果您保留 ID 而不是实例,则可能没有对所保留对象的任何引用,并且可能会被垃圾回收。我知道在你的情况下这可能不会发生,因为你将所有团队都放在一个地图中,但这仍然是一个风险,因此应该避免。

【讨论】:

  • 感谢您的信息。我还有一个问题:对对象的引用需要多少内存?
  • @lnsdeath 不必担心 - 目前不要担心这样的性能细节。以后需要的话你会知道的!
【解决方案2】:

显然,如果不知道将在其中使用它的上下文,就不可能在这里肯定地说 - 但从代码设计的角度来看,“自然”的期望是一个团队包含玩家,所以它是团队会引用播放器对象,而不是相反。

如果您开始使用 ID 并需要存储大量不同的对象,听起来您需要更多的数据库,在这种情况下,如果您不想退出,请查看 HSQLDB 之类的东西Java。

【讨论】:

  • 我认为它需要是双向连接。 Team 将保存一个 Player 列表,而 Player 将保存 Team。我想轻松确定一支球队有多少球员以及一名球员在哪个球队。
【解决方案3】:

使用对象引用作为 HashMap(或任何 Map)中的键的潜在危险是,如果操作不当,可能会导致内存泄漏。

如果仍然有对它的引用,则不会对对象进行垃圾回收。如果用作 Map 中的键,则将其视为对该对象的引用。

你可以绕过这个using WeakReference

在您描述的情况下,您可能应该将对象用作键,但请注意上述情况。

【讨论】:

  • 不,我不使用引用作为映射中的键 - 我只使用整数来标识对象,所以这应该不是问题。
  • 啊我误解了这个问题...提示:始终使用代码示例。 ;-)
【解决方案4】:

private Team team 是您提到的两种方法之间的一种方式。如果您存储 Id,如果 HashMap 随之更新会发生什么?这会造成不必要的依赖。

【讨论】:

    【解决方案5】:

    您使用数据库?如果有,请将队伍的ID保存在player中,否则我建议您保存队伍的引用。

    【讨论】:

    • -1 不同意。仅仅因为后台有一个数据库并且表使用了一个 ID,就没有理由在对象中使用一个 ID。有很多 ORM 解决方案 (Hibernate) 可以让这变得简单。
    • 所以,我发现我之前说的不是那么“正确”,而且,是的,这取决于...
    猜你喜欢
    • 2020-08-04
    • 2017-11-06
    • 2023-03-10
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多