Java - 对象引用或标识符?

时间:2011-09-29 11:07:03

标签: java

我目前正在创建一个大型项目,因此我希望尽可能高效地完成所有工作。

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

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

现在,我想知道什么是最好的方法来了解玩家被分配到的球队:

- >将团队的ID存储在Player(私有int团队)中,然后使用此ID从团队中的HashMap获取团队。

- >存储对玩家团队的参考(私人团队)

有谁知道哪个更好,哪个最重要的专业人士,骗局和危险是什么?

谢谢!

5 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:0)

显然,如果不知道它将被使用的背景,就不可能肯定地说这里 - 但从代码设计的角度来看,“自然”的期望是团队包含玩家,所以团队会参考玩家对象,而不是相反。

如果你开始搞乱ID并需要存储大量不同的对象,听起来好像你需要更多的数据库,在这种情况下,如果你不想退出,请查看类似HSQLDB的内容Java的。

答案 2 :(得分:0)

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

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

你可以绕过这个using WeakReference

在您描述的情况下,您可能应该使用对象作为键,但要注意上述条件。

答案 3 :(得分:0)

private Team team是您提到的两种方法之间的路径。如果您存储了Id,那么如果更新HashMap会发生什么?这会产生不必要的依赖关系。

答案 4 :(得分:-1)

您使用数据库吗?如果是这样,请将团队的ID存储在播放器中,否则我建议您存储团队的参考。