【问题标题】:How to set enum DTO object using enum VO object?如何使用枚举 VO 对象设置枚举 DTO 对象?
【发布时间】:2020-10-17 22:22:54
【问题描述】:

如何将一个对象转换为另一个对象?例如,我有 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;
    }
}

【问题讨论】:

  • 您编写了一个映射器,将一个映射到另一个。顺便说一句,你只需要一次anum。
  • 我已经使用 ModelMapper 进行映射。 modelmapper.org

标签: java dto


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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 类型转换为另一种类型,然后在工厂方法中使用它。

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

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多