Есть программа для сохранения в базе объектов Car. Нужно добавить возможность сохранения и обработки обьектов типа Airplane, а так же требуется сделать рефакторинг, добавить возможость обрабатывать другие типы-наследники Collateral.
Входящий Collateral объект кастуется к соответствующему типу и к нему применяются методы соответствующей ему реализации Service (carService, airplaneService и т.д.). Как можно автоматизировать весь этот процесс?
Можно прописать аналогичные saveCollateral и getInfo для AirplaneDto, но получается дублирование кода и при добавлении других типов объектов придется опять писать кучу кода
Помогите....
// TODO: reimplement this
@Service
public class CollateralService {
/* CarService - интерфейс, реализуемый классом CarServiceImpl
в котором создается адаптер для входящего CarDto и реализуются
все методы, вызываемые в этом сервисе
*/
@Autowired
private CarService carService;
@SuppressWarnings("ConstantConditions")
public Long saveCollateral(Collateral object) {
if (!(object instanceof CarDto)) {
throw new IllegalArgumentException();
}
/*CarDto - наследует Collateral*/
CarDto car = (CarDto) object;
/*
Метод carService.approve() создает адаптер класса
CarDto и отправляет на проверку в соответствующий сервис.
Перед сохранением все объекты должны пройти проверку
*/
boolean approved = carService.approve(car);
if (!approved) {
return null;
}
return Optional.of(car)
.map(carService::fromDto)
.map(carService::save)
.map(carService::getId)
.orElse(null);
}
public Collateral getInfo(Collateral object) {
if (!(object instanceof CarDto)) {
throw new IllegalArgumentException();
}
return Optional.of((CarDto) object)
.map(carService::fromDto)
.map(carService::getId)
.flatMap(carService::load)
.map(carService::toDTO)
.orElse(null);
}
}