【问题标题】:Destroying multiple references to the same object in Java在Java中销毁对同一对象的多个引用
【发布时间】:2014-10-22 04:16:52
【问题描述】:

假设我有一个 Citizen 类和一个 Population 类。人口包含一组公民。

在这个模拟中,市民可能会死亡。目前,为了代表公民的死亡,我销毁了对该公民对象的所有引用,因为人口可能不包含死亡公民。

我希望能够在公民重叠的地方创建多个 Population 对象。前任。公民 C 可能同时属于人口 A 和人口 B。但是,这使公民死亡变得困难,因为如果发生死亡,我将不得不从 A 和 B 中删除公民 C。有时 A 和 B 甚至不在同一个范围内。

此外,每个公民必须至少属于一个人口。

一般来说,我将如何组织我的 Population 和 Citizen 课程,以确保在该公民死亡后将其从所有 Population 实例中完全删除?

我正在考虑让 Citizen 成为 Population 的成员类,但我不知道从那里去哪里。

谢谢。

【问题讨论】:

  • 如何 Citizen 包含她所属的人口列表。
  • 这是目前最可取的解决方案,但我不愿为每个公民存储人口参考列表,因为我的模拟可能涉及数以万计的公民和数百个人口,这似乎是很多浪费的内存。如果没有更好的解决方案,我可能会接受它。谢谢。
  • 在这种情况下,也许不要将整个人口对象存储在列表中,而只是将其id 或列表中的其他键存储。
  • 请原谅我的无知,但不是通过引用存储的对象列表吗?我不确定 List 与 List 相比如何节省大量内存。
  • 你是对的。通常对于对象引用,在 32 位机器上是 32 位,在 64 位机器上是 64 位。因此,使用原始 int 可能会有所收获。但同样,这可能不值得付出努力,我会选择我原来的解决方案。

标签: java oop reference garbage-collection


【解决方案1】:

如果您将其视为现实生活中的场景,如果一个公民属于少数人群,那么在死亡的情况下需要通知这些人群(比如说,如果他是法国人和美国人,那么两国都需要知道取消他的护照等)。因此,正如@nablex 建议的那样,这里的观察者模式听起来是最合适的解决方案。 开设一门课程,例如“MinistryOfDeath”之类的课程,以告知相关人群。

【讨论】:

  • 看了所有的答案,我要选择这个。这是我没有考虑过的,与 isDead() 解决方案(nablex)和对每个群体的反向引用(即使我使用短裤)相反。
【解决方案2】:

这个问题有很多解决方案,比如观察者模式等,但是如果从公民到人口的反向链接已经被认为太重了,那么这个方向的任何解决方案都可能太重了。

如果您真的不想要反向链接(尽管可能是最好的选择和内存可能不会受到那么的严重影响),您总是可以使用 isDead () 关于公民。

然后,任何人口都必须定期或在访问时修剪死去的公民。

【讨论】:

    【解决方案3】:

    List<Population 相比,对所有人口进行编号的 int[] 仅在 32 GB 以上的机器上可以节省一半的内存,其中压缩的 OOP 不够用,否则什么也没有。

    int[] 相比,使用short[] 可以节省一半的内存。使用BitSet 可以节省更多。您甚至可以运行自己的,例如 2 longs 用于一组固定的 128 个人口,并且每个 Citizen 仅使用 16 个字节。这比从Populations 到Citizens 的正向链接便宜得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 2017-06-29
      • 2012-02-06
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多