如何使用枚举 VO 对象设置枚举 DTO 对象?

How to set enum DTO object using enum VO object?

如何将一个对象转换为另一个对象?例如,我有 3 类 Car(等于 CarVO)、CarDTO 和 CarFactory。问题在于我无法通过 Car 的对象设置 CarDTO 的对象。我应该将它转换为字符串还是什么?如果有任何帮助,我将不胜感激!

public class Car {
    private Long id;
    private String model;
    private Engine engine;
    private Integer manufacturedYear;

    private enum Engine {Petrol, Diesel, Gas}

    // Constructor, setters & getters

}

public class CarDTO {
    private Long id;
    private String model;
    private Engine engine;
    private Integer manufacturedYear;

    private enum Engine {Pertol, Diesel, Gas}

    // Constructor, setters & getters

}

public enum CarFactory {
    INSTANCE;

    CarFactory() {}

    public static CarFactory getInstance() {return INSTANCE;}

    public CarDTO createCarDTO(Car car) {
        CarDTO carDTO = new CarDTO();
        carDTO.setId(car.getId());
        carDTO.setModel(car.getModel());
        carDTO.setEngine(car.getEngine()); // Here is an issue 
        carDTO.setManufacturedYear(car.getManufacturedYear());
        return carDTO;
    }
}

你可以在工厂方法中做不同引擎枚举之间的映射:

public CarDTO createCarDTO(Car car) {
    CarDTO carDTO = new CarDTO();
    carDTO.setId(car.getId());
    carDTO.setModel(car.getModel());
    switch (car.getEngine()) {
        case Diesel:
            carDTO.setEngine(CarDTO.Engine.Diesel);
        case Gas:
            carDTO.setEngine(CarDTO.Engine.Gas);
        case Petrol:
            carDTO.setEngine(CarDTO.Engine.Pertol);
    }
    carDTO.setManufacturedYear(car.getManufacturedYear());
    return carDTO;
}

请注意,我必须将两个引擎枚举的可见性更改为包范围才能执行此操作。

一种更简洁、更可重用的方法是编写一个单独的方法,将一种 Engine 类型转换为另一种类型,然后在工厂方法中使用它。

...当然,您当然可以采用引入映射器库或其他更强大的东西的其他答案。我只是想告诉你,你尝试直接做的事情是可行的。

CarDTOCar 看起来像 数据传输对象 模型,例如带有 Hybernate 注释。这些 classes lools 大多相似,但不能互相使用。 要将一种转换为另一种,您有多种选择:

  • 通过将所有字段从一个 class 复制到另一个
  • 创建您自己的转换器
  • MapStruct是你的朋友! - 使用 MapStruct 功能相同但代码更少。