设置为null指向该Object的所有内容

时间:2014-05-08 17:32:43

标签: java structure

我正在编写一个Java程序,其中包含Survivor对象。在源中的任何地方都存在并将有许多属性(例如this.leader),列表(例如所有幸存者,女性幸存者)以及可能引用它们的其他内容。我想要最干净的方式 - 并且从长远来看考虑编码时 - 要做到以下几点:

当幸存者死亡时,它会从他所在的列表中删除,而“指向”他的属性现在设置为空。

我希望它能够以这样的方式,如果我为新功能添加另一个List,我将不必记住以某种方式或任何方式初始化它。我只需像往常一样使用它,而死亡的幸存者只会因为课程的结构而被删除,或者我现在会在你的帮助下写下任何东西。

Java的问题在于,当幸存者死亡时,假设我将其从主列表中删除,它仍然会在女性幸存者中,并且不会被删除,因为垃圾收集器仍然会检测到引用。我不知道在c ++中,指向已删除对象的指针是否为空,但这将接近预期的行为。

我不在乎现在是否有大量的工作要做,复杂的类和子类扩展List或其他什么,只要我明天不用关心它。

我已经考虑过使用meta-class,这将是真正的幸存者,但是存在缺陷并且不起作用。我还想过使用我自己的List类,它会静态更新所有新列表,并在必要时从这些列表中删除死亡,但它也失败了,并且不能用于简单的属性。 我想我还可以在对该列表做任何事情之前检查一个死的布尔值,但这远远不是我想要达到的干净代码。

非常感谢你的帮助。

编辑:由于看起来不太清楚,现在,幸存者类代表了一个真正的幸存者。实际属性的示例是name和isFemale。 但我仍然需要列出你无法从幸存者中推断出的东西,例如currentScavengingTeam。

4 个答案:

答案 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...
}

然后,你只有一个列表中包含所有幸存者,当一个人死亡时,你只需要一个列表来移除他/她。例如,如果你需要对女性幸存者采取行动,你只需检查他们的性别是女性,如果不是,请跳过幸存者并转到列表中的下一位。