gpt4 book ai didi

java - 创建并填充类 T 或从 T 扩展的对象的属性,无需重复代码

转载 作者:行者123 更新时间:2023-12-02 03:25:21 27 4
gpt4 key购买 nike

我开发了一个提供 REST 服务的 Java EE 应用程序。我决定永远不公开底层实体,使用 POJO 发送数据。当用户请求列表时,应用程序会发送包含最少信息的 POJO 列表,但如果用户请求特定资源,他将获得更详细的 POJO。例如,假设我有一个 Car 实体,我可以这样:

public class BaseCar {
private String model;
private int year;
// [...getters and setters...]
}

还有这个:

public class FullCar extends BaseCar {
private String color;
private int maxSpeed;
private List<String> comments;
// [...getters and setters...]
}

因此,如果用户调用/cars,他将获得 BaseCar 列表,但如果他调用/cars/10,他将获得 FullCar。实际上我有两种创建 BaseCar 和 FullCar 的方法:

public BaseCar toBaseCar(Car car) {
BaseCar baseCar = new BaseCar();
baseCar.setModel(car.getModel());
baseCar.setYear(car.getYear());
}

public FullCar toFullCar(Car car) {
FullCar fullCar = new FullCar();
fullCar.setModel(car.getModel());
fullCar.setYear(car.getYear());
fullCar.setColor(car.getColor());
fullCar.setMaxSpeed(car.getMaxSpeed());
fullCar.setComments(new ArrayList<String>());
for (Comment comment : car.getCommentsCollection()) {
fullCar.getComments().add(comment.getText());
}
}

正如您所看到的,有重复的代码(在本例中只有 setModel()setYear(),但通常会更多)。我知道我可以做什么来避免这些重复:

BaseCar baseCar = (baseCar) toFullCar(car);

但我不想这样做,因为如果我不打算使用它们,我不想使用更多内存或加载集合。其实我的愿望是这样的:

public FullCar toFullCar(Car car) {
FullCar fullCar = toBaseCar(car);
fullCar.setColor(car.getColor());
fullCar.setMaxSpeed(car.getMaxSpeed());
fullCar.setComments(new ArrayList<String>());
for (Comment comment : car.getCommentsCollection()) {
fullCar.getComments().add(comment.getText());
}
}

但是从 BaseCar 转换为 FullCar 是不可能的。有没有办法避免重复相同的代码块(有时相当大)?

最佳答案

向采用 Car 参数的 BaseCarFullCar 添加构造函数:

interface Car {
String getModel();

int getYear();

String getColor();

int getMaxSpeed();

List<String> getComments();

}

public class BaseCar {
private String model;
private int year;

public BaseCar(Car c) {
this.model = c.getModel();
this.year = c.getYear();
}

public String getModel() {
return model;
}

public void setModel(String model) {
this.model = model;
}

public int getYear() {
return year;
}

public void setYear(int year) {
this.year = year;
}

}

public class FullCar extends BaseCar {
private String color;
private int maxSpeed;
private List<String> comments;

public FullCar(Car c) {
super(c); // Set up base car.
this.maxSpeed = c.getMaxSpeed();
this.color = c.getColor();
this.comments = new ArrayList<>(c.getComments());
}

}

public BaseCar toBaseCar(Car car) {
return new BaseCar(car);
}

public FullCar toFullCar(Car car) {
return new FullCar(car);
}

关于java - 创建并填充类 T 或从 T 扩展的对象的属性,无需重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39009177/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com