当前位置: 首页 > 面试题库 >

设计具有延迟加载属性的Java POJO

陶英纵
2023-03-14
问题内容

请考虑以下示例:

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

每个用户也可以拥有一个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()

但是,我一直认为通过这种方式,我的User对象不再是简单的pojo了,这也不是一种好方法。

我怎样才能更好地达到这一要求。


问题答案:

我一直认为,这样我的User对象不是简单的pojo

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

Pojo是一个 普通的旧Java对象 ,意味着您仅使用“标准”
java。这个术语是在J2EE大肆宣传时创建的。此时,开发人员在企业Bean中编码了业务逻辑,而这个EJB需要大量的基础结构代码。这个事实将商务逻辑与实现技术结合在一起。因此,丽贝卡·帕森斯(Rebecca
Parsons),乔什·麦肯齐(Josh MacKenzie)和马丁·福勒(Martin
Fowler)得出的结论是,如果仅使用标准Java,业务逻辑将具有更高的可重用性和更易于测试。因此,他们创建了术语pojo,因为开发人员喜欢花哨的名字。


您的 User 课程仅取决于标准Java,因此 它是pojo

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

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

至少这里是我对bean,pojos,贫乏和富域模型的一些想法。

  • Pojos和Java Bean之间的区别
  • 贫血与富域模型

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



 类似资料:
  • 问题内容: 我正在尝试把我的头围住Swift语言。使用Objective-C在代码中构建视图时,常见的模式是覆盖UI属性并像这样延迟加载它们: 这允许将UIElement的配置包含在其设置中,但是不会导致每次都对其进行重新配置。 看来我们无权访问Swift中的后备存储,并且关键字实际上没有相同的语义。 我很好奇是否有人在Swift中找到了类似的模式,该模式允许人们以一种简洁的语法方式将变量和常量的

  • 问题内容: foo类有一个酒吧。除非访问,否则不会加载钢筋。进一步访问bar应该不会产生任何开销。 是否可以使用属性或更好的属性来执行类似的操作,而不是使用getter方法? 目标是在所有后续访问中无负载地延迟加载… 问题答案: 当前的答案存在一些问题。具有属性的解决方案要求您指定其他类属性,并且在每次查找时都要检查该属性。该解决方案的问题在于,它会隐藏该属性,直到首次访问。这不利于自省,并且不便

  • 本文向大家介绍Python类属性的延迟计算,包括了Python类属性的延迟计算的使用技巧和注意事项,需要的朋友参考一下 所谓类属性的延迟计算就是将类的属性定义成一个property,只在访问的时候才会计算,而且一旦被访问后,结果将会被缓存起来,不用每次都计算。 优点 构造一个延迟计算属性的主要目的是为了提升性能 实现 说明 定义了一个延迟计算的装饰器类LazyProperty。Circle是用于测

  • 问题内容: 我倾向于将Hibernate与Spring框架结合使用,它具有声明式事务划分功能(例如@Transactional)。 众所周知,hibernate试图尽可能做到 非侵入性 和 透明性 ,但是事实证明,在使用关系时这 更具挑战性 。 我看到了许多具有不同透明度的设计方案。 使关系不延迟加载(例如, 这违反了整个延迟加载的想法。 使用初始化初始化集合 这意味着与DAO的耦合较高 尽管我们

  • 问题内容: 我有一个Hibernate对象,其属性都被延迟加载。这些属性大多数是其他Hibernate对象或PersistentSets。 现在,我想强制Hibernate只渴望一次加载这些属性。 当然,我可以通过“接触”这些属性中的每一个,但是也许还有另一种方法可以实现我的目标。 问题答案: 该文档将其如下所示: 您可以在HQL中强制执行通常急切的属性获取。 参考文献 Hibernate Cor

  • 描述 (Description) 延迟加载可应用于图像,背景图像和淡入效果,如下所述 - 对于图像 要在图像上使用延迟加载,请按照给定的步骤进行操作 - 使用data-src属性而不是src属性来指定图像源。 将类lazy添加到图像。 <div class = "page-content"> ... <img data-src = "image_path.jpg" class = "l