创建和填充T类对象的属性或从T扩展而无需重复代码

时间:2016-08-18 02:44:43

标签: java casting subclass pojo entities

我开发了一个提供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是不可能的。有没有办法避免重复相同的代码块(有时非常大)?

1 个答案:

答案 0 :(得分:2)

BaseCarFullCar参数添加构造函数:

Car