首页 > 解决方案 > 如何避免在这里创建类似对象的冗余实例化?

问题描述

我必须编写一个代码来记录参加不同活动的竞争对手。竞争对手是一个具有以下属性的类:姓名、姓氏、年龄、id。Event 是一个具有以下属性的类:名称、日期、竞争对手列表。

然后教授说我还必须跟踪竞争对手是否已确认他们参加了该赛事。那是一个竞争对手可以在一个事件中列出,但可能还没有确认他们的参与。如何实现这取决于我。

因此,请记住,竞争对手可能会参加多个赛事,我想避免为他参加的每个赛事为同一个人创建一个 Competitor 对象。

我在想一些在 C 中听起来最佳但我无法翻译成 Java 的东西:我想创建一个新类 CompetitorInEvent,它将保存竞争对手中包含的所有信息以及表示事件确认的布尔值(没有说明哪个事件,因为这样的竞争者InEvent 所属的列表已经告诉它)。

因此,我会将竞争对手列表转换为活动中的竞争对手列表。

CompetitorInEvent 不应扩展 Competitor,而应持有对 Competitor 对象的引用。在 C 中,我保证只访问这个引用来读取而不是写入,并且我会让结构 CompetitorInEvent 只存储一个地址和一个布尔值(或者更确切地说是 C 中的一个短)。这对我来说似乎是正确的,因为我没有多次实例化相同的现实世界对象或浪费内存。但是有没有办法在 Java 中实现这些相同的目标?我知道指针不可用。

标签: java

解决方案


Java 保存对对象的引用,您可以将其视为指针。您只是不能像 C 中的指针那样对引用进行任何算术运算。因此,此代码显示了两个引用同一个竞争对手的 CompetitorInEvents:

class CompetitorInEvent {
    private Competitor competitor;

    public CompetitorInEvent(Competitor competitor) {
        this.competitor = competitor;
    }
}

然后使用这个:

Competitor aCompetitor = new Competitor();
CompetitorInEvent event1 = new CompetitorInEvent(aCompetitor);
CompetitorInEvent event2 = new CompetitorInEvent(aCompetitor);

现在只有一个 Competitor 实例化,有 3 个对它的引用:局部变量 aCompetitor 和两个事件。请注意,Java 维护对象的引用计数,并且在局部变量超出范围(或重新分配给另一个引用)之前不会垃圾收集(销毁)aCompetitor,并且两个 CompetitorInEvent 对象都被销毁/垃圾收集。


推荐阅读