在Java中销毁对同一对象的多个引用

时间:2014-10-22 04:16:52

标签: java oop reference garbage-collection

假设我有 Citizen 类和人口类。人口中包含一群公民。

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

我希望能够创建多个可以公民重叠的人口对象。防爆。公民C可能同时属于人口A和人口B.然而,这使得公民死亡变得困难,因为我必须在死亡事件中从A和B中移除公民C.有时A和B甚至不在同一范围内。

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

一般来说,我如何组织我的人口和公民课程,以确保在公民死后公民被完全从所有人口中移除?

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

感谢。

3 个答案:

答案 0 :(得分:1)

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

如果你真的不想要反向链接(虽然可能是最好的选择,内存可能会赢得 非常糟糕),你可以总是在公民身上有一个isDead()。

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

答案 1 :(得分:1)

如果你认为它是一个现实生活场景,如果一个公民属于少数人口,那么在死亡的情况下,这些人群需要被告知(比方说,如果他是法国人和美国人,两个国家都需要知道取消他的护照等)。因此,@ nablex建议的观察者模式听起来像是最合适的解决方案。 有一个班级,比如“MinistryOfDeath”或类似的东西,会告知相关人群。

答案 2 :(得分:0)

List<Population进行比较时,所有人口编号的int[]只能在32 GB以上的机器上节省一半的内存,压缩的OOP不足以满足要求,否则什么都没有。

short[]相比,使用int[]可节省一半内存。使用BitSet可以节省更多。您甚至可以运行自己的,例如2 long s,用于固定的128个群体,每个Citizen仅使用16个字节。这比从Population s到Citizen s的前向链接便宜得多。