Я пытаюсь преобразовать набор различных типов, использующих общий интерфейс, в другой набор типов, которые также используют другой общий интерфейс.
Типичным случаем использования этого является отображение полиморфа c сущность для различных различных DTO. Давайте предположим, что каждый конкретный тип имеет соответствующий DTO, в который он должен быть преобразован, и каждое преобразование уникально и задает c для этого типа.
Представьте себе интерфейс Vehicle
с Car
и Boat
реализации, которые должны быть преобразованы в CarDTO
и BoatDTO
соответственно:
public class VehicleConverter {
private Map<Class<? extends Vehicle>, Function<Vehicle, DTO>> converters;
public VehicleConverter() {
this.converters = new HashMap<>();
converters.put(Car.class, v -> convertCar((Car) v));
converters.put(Boat.class, v -> convertBoat((Boat) v));
}
public DTO convert(Vehicle v) {
return converters.get(v.getClass()).apply(v);
}
private CarDTO convertCar(Car car) {
// do something car-specific
return new CarDTO();
}
private BoatDTO convertBoat(Boat boat) {
// do something boat-specific
return new BoatDTO();
}
}
Как вы можете видеть, я «регистрирую» каждое преобразование типов в Map с ключом Class, но мне все еще нужно вручную привести предоставленный Vehicle v
в соответствующий подтип.
Есть ли способ обойти это? Есть ли лучший подход к тому, чего я пытаюсь достичь?
Ради аргументации и для простоты я хотел бы контролировать эту логику c вручную и не полагаться на Spring Converters или что-то подобное ModelMapper