我是Java新手,我正在开发一个Public Transit Java应用程序作为第一个小项目。
我通过XML API(使用DOM XML API)从服务器加载传输数据。因此,当您调用构造函数来表示BusStop(int id)时,构造函数会根据提供的ID从服务器加载有关该Stop的信息。所以,我想知道几件事:我怎样才能确保我没有实例化具有相同id的两个BusStop对象(我只想为每个BusStop一个对象)?
也有人建议我应该如何加载对象,所以每次运行应用程序时,我都不需要加载整个数据库,只需要BusStop,以及该停止的相关Arrivals和BusTrips对象?我之前已经完成了C ++和MVC PHP编程,但是没有经历过使用循环对象引用等加载大量对象的经历。
谢谢!
答案 0 :(得分:1)
我不会在构造函数中启动下载/反序列化过程。我会为每个实体类型编写一个管理器类,并使用一种方法根据其ID获取给定实体的Java对象。使用密钥类型的HashMap
作为实体ID,将值类型作为该对象的Java类。管理器将使用您的首选模式(我可能会使用静态成员来简化)。
fetch方法应该做的第一件事是检查映射以查看它是否包含给定ID的条目。如果它已经获取并构建此对象,则返回它。如果没有,则从远程服务获取实体,适当地反序列化对象,按指定的ID将其加载到HashMap
,然后返回。
关于对其他对象的引用,我建议您将它们表示为Java对象中的ID,而不是将它们存储为Java对象引用,并将它们与引用对象同时反序列化。应用程序可以通过相关管理器按需懒惰地实例化这些对象。这通过循环引用减少了问题。
如果数据量可能超过JVM上的可用RAM,则需要考虑定期从地图中删除旧对象以恢复内存(确信在需要时会重新加载)。
答案 1 :(得分:1)
对于这个应用程序,我将使用以下Java EE技术:JAX-RS,JPA和JAXB。您会发现几乎每个Java应用程序服务器都包含这些技术(即GlassFish)。
JPA - Java持久性API
提供一种将对象转换为数据库或从数据库转换对象的简单方法。通过注释,您可以将关系标记为延迟,以防止读取整个数据库。此外,通过使用缓存数据库访问和对象创建也减少了。
JAXB - 用于XML绑定的Java体系结构
提供将对象转换为XML或从XML转换对象的简单方法。 Java SE 6中包含一个实现。
JAX-RS - 用于RESTful服务的Java API
提供一个简单的API(通过HTTP)与XML交互。
示例强>
您可以查看我发布到我博客的示例:
答案 2 :(得分:0)
对于每个给定id只能加载一次的类,请使用某种Factory设计模式。在内部,您可能希望将id存储到Map中的实例映射。在实际从服务器获取数据之前,首先在此映射上执行查找,以查看是否已为此id加载了类。如果没有,则继续提取并更新地图。