java - 如何避免在这里创建类似对象的冗余实例化?
问题描述
我必须编写一个代码来记录参加不同活动的竞争对手。竞争对手是一个具有以下属性的类:姓名、姓氏、年龄、id。Event 是一个具有以下属性的类:名称、日期、竞争对手列表。
然后教授说我还必须跟踪竞争对手是否已确认他们参加了该赛事。那是一个竞争对手可以在一个事件中列出,但可能还没有确认他们的参与。如何实现这取决于我。
因此,请记住,竞争对手可能会参加多个赛事,我想避免为他参加的每个赛事为同一个人创建一个 Competitor 对象。
我在想一些在 C 中听起来最佳但我无法翻译成 Java 的东西:我想创建一个新类 CompetitorInEvent,它将保存竞争对手中包含的所有信息以及表示事件确认的布尔值(没有说明哪个事件,因为这样的竞争者InEvent 所属的列表已经告诉它)。
因此,我会将竞争对手列表转换为活动中的竞争对手列表。
CompetitorInEvent 不应扩展 Competitor,而应持有对 Competitor 对象的引用。在 C 中,我保证只访问这个引用来读取而不是写入,并且我会让结构 CompetitorInEvent 只存储一个地址和一个布尔值(或者更确切地说是 C 中的一个短)。这对我来说似乎是正确的,因为我没有多次实例化相同的现实世界对象或浪费内存。但是有没有办法在 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 对象都被销毁/垃圾收集。
推荐阅读
- swift - 如何将嵌套数据保存到 Firestore?
- c - Dietlibc、lowfat、opentracker - 针对替代 libc 进行编译
- autodesk-forge - Autodesk Forge Viewer 透明背景
- c++ - 架构 x86_64 c++ Visual Studio 代码的未定义符号。游戏蛇和梯子
- c# - 如何在 ASP.NET Core 中仅针对特定 URL 使用 Spa()
- javascript - 使用 jsPDF 节省一些空间?
- asp.net - 从 Google 登录获取 Jwt Payload,无需默认 Google 弹出窗口
- c# - Vb.Net:用户控件Datagridview列不序列化
- r - 带标准差的线图
- postgresql - PostgreSQL lower() 和 upper() 不适用于某些土耳其语字符