java - 如何使用枚举 VO 对象设置枚举 DTO 对象?
问题描述
如何将一个对象转换为另一个对象?例如,我有 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 枚举的可见性更改为包范围才能执行此操作。
一种更简洁、更可重用的方法是编写一个单独的方法,将一种Engine
类型转换为另一种类型,然后在工厂方法中使用它。
...当然,您当然可以采用其他方法来引入映射器库或其他更强大的东西。我只是想告诉你,你试图直接做的事情是可行的。
推荐阅读
- laravel - Laravel - 为每条路线添加路线通配符
- css - CSS 设置动态值取决于类
- c# - 通过指定的起始索引和规则从列表中获取子列表中其他以下元素的子列表
- asp.net-mvc - Azure Active Directory 的 TenantID 和 ClientID 是否被视为机密?
- reactjs - Draft.js 内联样式在没有文本选择的情况下不起作用
- c# - 尝试将控制器添加到 Web API 时出错
- symfony - 如何在 Symfony 状态机回调类方法中注入参数?
- ios - 如何使用 Cyber source SDK iOS 添加金额?
- java - WebDriver 没有启动 ChromeDriver
- java - 附加到 http 响应的 Zip 文件在 chrome 中下载但不在 Firefox 中