我开发了一个提供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
是不可能的。有没有办法避免重复相同的代码块(有时非常大)?
答案 0 :(得分:2)
为BaseCar
和FullCar
参数添加构造函数:
Car