我正在编写一个Java程序,其中包含Survivor对象。在源中的任何地方都存在并将有许多属性(例如this.leader),列表(例如所有幸存者,女性幸存者)以及可能引用它们的其他内容。我想要最干净的方式 - 并且从长远来看考虑编码时 - 要做到以下几点:
当幸存者死亡时,它会从他所在的列表中删除,而“指向”他的属性现在设置为空。
我希望它能够以这样的方式,如果我为新功能添加另一个List,我将不必记住以某种方式或任何方式初始化它。我只需像往常一样使用它,而死亡的幸存者只会因为课程的结构而被删除,或者我现在会在你的帮助下写下任何东西。
Java的问题在于,当幸存者死亡时,假设我将其从主列表中删除,它仍然会在女性幸存者中,并且不会被删除,因为垃圾收集器仍然会检测到引用。我不知道在c ++中,指向已删除对象的指针是否为空,但这将接近预期的行为。
我不在乎现在是否有大量的工作要做,复杂的类和子类扩展List或其他什么,只要我明天不用关心它。
我已经考虑过使用meta-class,这将是真正的幸存者,但是存在缺陷并且不起作用。我还想过使用我自己的List类,它会静态更新所有新列表,并在必要时从这些列表中删除死亡,但它也失败了,并且不能用于简单的属性。 我想我还可以在对该列表做任何事情之前检查一个死的布尔值,但这远远不是我想要达到的干净代码。
非常感谢你的帮助。
编辑:由于看起来不太清楚,现在,幸存者类代表了一个真正的幸存者。实际属性的示例是name和isFemale。 但我仍然需要列出你无法从幸存者中推断出的东西,例如currentScavengingTeam。答案 0 :(得分:0)
这似乎是一个糟糕的设计决定,我不知道有什么“缺陷”,但我敦促你重新考虑它们。拥有Survivor
类代表实际的幸存者甚至听起来更合理。
关于你的问题:
如果我被迫进入这个设计,我可能会为SurvivorEvents添加EventBus(不好!但在这种情况下似乎不可避免)。幸存者事件将代表幸存者发生的事情,包括他们的死亡。当幸存者去世时,他通过这辆公共汽车向所有听众发送一个事件。那么你的清单就是:
class SurvivorList extends List<Survivor> implements SurvivorListener {
@Override
public void survivorUpdated(SurvivorEvent e) {
if (e instanceOf SurvivorDiedEvent) {
remove(e.getSurvivor());
}
}
<Overridden constructor that calls super() and adds listener>
}
您还可以发送各种其他更改幸存者属性的事件,并让您的收藏集自动添加或移除幸存者。
警告:虽然这是一个非常强大的工具,但创建大量事件非常容易,特别是如果您开始发送事件以响应事件。
答案 1 :(得分:0)
你想要的是不可能的。我建议您使用类似survivor.isAlive()
的内容来确定它是否存活,然后您也可以在遇到它们时从列表中删除死亡幸存者引用。
答案 2 :(得分:0)
您可以使用SurvivorList
课程执行此操作。
public void add(Survivor survivor) {
super.add(survivor);
survivor.addHolder(this);
}
public void destroyList() {
for (Survivor survivor : this) {
survivor.removeHodler(this);
}
}
然后,您的幸存者类有以下方法:
public void addHolder(List list) {
holders.add(list);
}
public void removeHolder(List list) {
holder.remove(list);
}
public void destroy() {
for(List holder : holders) {
holder.remove(this);
}
}
然后,正常代码:
SurvivorList sl = new SurvivorList();
Survivor s = new Survivor();
sl.add(s);
...
s.destroy();
沿着这些方向的东西可以起作用。诀窍是确保正确调用s.destroy和sl.destroyList。
答案 3 :(得分:0)
听起来你正在跟踪使用这些列表的幸存者的特征,当每个幸存者都应该是幸存者类的一个对象时,它包含所有这些特征。
例如,Survivor对象可能具有以下属性和值: (注意:这不是代码,只是Survivor对象内容的一个例子)
survivorOne {
name = "Fred"
gender = "female"
role = "leader"
etc...
}
然后,你只有一个列表中包含所有幸存者,当一个人死亡时,你只需要一个列表来移除他/她。例如,如果你需要对女性幸存者采取行动,你只需检查他们的性别是女性,如果不是,请跳过幸存者并转到列表中的下一位。