Я разработал приложение Java EE, предлагающее услуги REST. Я решил никогда не раскрывать базовые объекты, используя POJO для отправки данных. Когда пользователь запрашивает список, приложение отправляет список POJO с минимальной информацией, но если пользователь запрашивает конкретный ресурс, он получит более подробное POJO. Например, представьте себе, у меня есть Car
сущность, я могу иметь это:Создайте и заполните свойства объекта класса T или расширенные от T без дубликата кода
public class BaseCar {
private String model;
private int year;
// [...getters and setters...]
}
и это:
public class FullCar extends BaseCar {
private String color;
private int maxSpeed;
private List<String> comments;
// [...getters and setters...]
}
Так что, если звонки пользователей/авто он получит список BaseCar
с, но если он называет/cars/10, он получает FullCar
. На самом деле я два метода для создания BaseCar и FullCar:
public BaseCar toBaseCar(Car car) {
BaseCar baseCar = new BaseCar();
baseCar.setModel(car.getModel());
baseCar.setYear(car.getYear());
}
public FullCar toFullCar(Car car) {
FullCar fullCar = new FullCar();
fullCar.setModel(car.getModel());
fullCar.setYear(car.getYear());
fullCar.setColor(car.getColor());
fullCar.setMaxSpeed(car.getMaxSpeed());
fullCar.setComments(new ArrayList<String>());
for (Comment comment : car.getCommentsCollection()) {
fullCar.getComments().add(comment.getText());
}
}
Как вы можете видеть, там повторяющийся код (в данном примере только setModel()
и setYear()
, но, как правило, больше). Я знаю, что я могу сделать, чтобы избежать этих повторений:
BaseCar baseCar = (baseCar) toFullCar(car);
Но я не хочу, чтобы это сделать, потому что я не хочу, чтобы использовать больше памяти или загружать коллекции, если я не буду использовать их , В самом деле, что я хочу что-то вроде этого:
public FullCar toFullCar(Car car) {
FullCar fullCar = toBaseCar(car);
fullCar.setColor(car.getColor());
fullCar.setMaxSpeed(car.getMaxSpeed());
fullCar.setComments(new ArrayList<String>());
for (Comment comment : car.getCommentsCollection()) {
fullCar.getComments().add(comment.getText());
}
}
Но литье из BaseCar
в FullCar
не представляется возможным. Есть ли способ избежать повторения одного и того же блока кода (иногда довольно большого)?
Это хорошая идея, и я уже думаю об этом, но не всегда у меня есть 1: 1 отношения между сущности и pojo, и я не уверен, что ставил логику в классе, который я использую только для обмена данными. Я имею в виду, конечно, могу, но мне это не нравится. –