java - 设计一个具有延迟加载特性的 Java POJO

标签 java session design-patterns

请考虑以下示例:

Web 应用程序为每个登录用户创建一个用户对象。此对象具有简单的 String 属性,用于 firstNamelastName ...

每个用户也可以拥有一辆汽车。考虑到获取用户 car 的开销非常大,因此我们不希望在用户登录时设置用户 car。相反,我们希望在用例需要时获取 car。

为了实现这一点,我们创建了一个用户 pojo 作为:

public class User() {
  private String FirstName;
  private String LastName;   
  private Car car;
  //Here we have the service object, this could be injected with spring or JEE
  private CarServices carServices;

  public Car getCar() {
    //If the car is not fetched yet, go on and get it from your service
    if (car == null) {
      car = carServices.getCarFromDB(...)
    }
    return car;
  }

}

登录后致初始用户:

User newUser = new User();
newUser.setFirstName("foo");
newUser.setLastName("bar");
//We just let user have service, so he can use this service latter
newUser.setCarServices( new CarServices() );

并且每个需要用户汽车的用例都可以轻松获得:

newUser.getCar()

但是,我一直争论说通过这种方式我的用户对象不再是一个简单的 pojo,这不是一个好方法。

我怎样才能更好地实现这个要求。

最佳答案

I have been argued that in this way my User object is not a simple pojo

为了回答您的问题,我想先回顾一下历史。

Pojo 是一个普通的旧 java 对象,意味着您只使用“标准”java。该术语是在 J2EE 大肆宣传的时候创建的。此时,开发人员在企业 bean 中编写业务逻辑,而此 EJB 需要大量基础结构代码。这一事实将业务逻辑与实现技术相结合。因此 Rebecca Parsons、Josh MacKenzie 和 Martin Fowler 得出结论,如果只使用标准 java,业务逻辑将更易于重用和测试。因此他们创造了术语 pojo ,因为开发人员喜欢花哨的名字。

您的 User 类仅依赖于标准 java,因此它是一个 pojo

一些开发人员认为 pojo 不应包含任何逻辑。这些开发人员更喜欢贫血模型。其他人说丰富的模型是更好的方法。我属于喜欢丰富模型而不是贫血模型的开发人员。

如果您想从 User 类中删除 CarServices 依赖项,您可以实现一个 Car 延迟加载代理 就像 hibernate 或 jpa 实现一样。

至少这里是我对 beans、pojos、贫血和富域模型的一些想法。

希望它在您与其他开发人员讨论时对您有所帮助。

关于java - 设计一个具有延迟加载特性的 Java POJO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33852033/

相关文章:

javascript - 拉斐尔,用图像填充背景 (fillfit)

c# - 类层次结构的适当设计

php - 关于 PHP session 的几个问题

java - 在名称为“的 DispatcherServlet 中找不到具有 URI [] 的 HTTP 请求的映射

java - 计算 FileUtils.copyURLToFile 写入文件的字节数?

java - 如何解决异常 [Error loading application.groovy due to [java.lang.ArrayIndexOutOfBoundsException] : 0] when deploying war?

node.js - Nodejs复制内部应用程序请求的cookie

c# - 空 Session 对象还记得 sessionID 吗?

java - 工厂方法更适合框架和库的抽象工厂吗?

java - Guice 配置/绑定(bind)最佳实践