Приводим пример ниже:Дизайн Java POJO с ленивой загрузкой
Веб-приложение создает объект пользователя для каждого зарегистрированного пользователя. Этот объект имеет простые String
свойства для firstName
, lastName
...
Каждый пользователь может иметь 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 и это не очень хороший подход.
Как я могу достичь этого требования лучше.
Вы объявили 'Car' как' cars', но позже использовали 'car' в качестве переменной, это опечатка? если да, исправьте. – Blip
Если класс пользователя должен инкапсулировать способ получения автомобиля, то код, который у вас есть, - это путь. Если получение автомобиля - это то, что пользователь не должен знать, то используйте классическую парадигму setCar/getCar. Затем, контракт заключается в том, чтобы пользовательские клиенты устанавливали автомобиль до того, как они получили автомобиль, а клиенты должны обрабатывать нулевой ответ getCar. - Кроме того, пользователь POJO и подкласс UserWithCar может быть подходом - зависит от вашего общего дизайна, предпочитаете ли вы это делать. – laune