假设我有 Citizen 类和人口类。人口中包含一群公民。
在此模拟中,公民可能会死亡。目前,为了代表公民的死亡,我销毁了对该公民对象的所有提及,因为人口可能不包含死亡公民。
我希望能够创建多个可以公民重叠的人口对象。防爆。公民C可能同时属于人口A和人口B.然而,这使得公民死亡变得困难,因为我必须在死亡事件中从A和B中移除公民C.有时A和B甚至不在同一范围内。
此外,每个公民必须至少属于一个人口。
一般来说,我如何组织我的人口和公民课程,以确保在公民死后公民被完全从所有人口中移除?
我正在考虑让Citizen成为人口的一员,但我不知道从那里去哪里。
感谢。
答案 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的前向链接便宜得多。