请考虑以下示例:
Web 应用程序为每个登录用户创建一个用户对象。此对象具有简单的 String
属性,用于 firstName
、lastName
...
每个用户也可以拥有一辆汽车
。考虑到获取用户 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/