Java 创建并填充T类对象或从T扩展而来的对象的属性,而不使用重复代码

Java 创建并填充T类对象或从T扩展而来的对象的属性,而不使用重复代码,java,casting,subclass,pojo,entities,Java,Casting,Subclass,Pojo,Entities,我开发了一个JavaEE应用程序,提供REST服务。我决定永远不公开底层实体,使用POJO发送数据。当用户请求列表时,应用程序会发送一个包含最少信息的POJO列表,但如果用户请求特定资源,他将获得更详细的POJO。 例如,假设我有一辆汽车实体,我可以有: public class BaseCar { private String model; private int year; // [...getters and setters...] } 这是: public cl

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

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...]
}
正如您所看到的,有重复的代码(在本例中,只有
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());
    }
}
public FullCar-toFullCar(小汽车){
FullCar FullCar=toBaseCar(汽车);
fullCar.setColor(car.getColor());
fullCar.setMaxSpeed(car.getMaxSpeed());
setComments(新的ArrayList());
for(注释:car.getCommentsCollection()){
fullCar.getComments().add(comment.getText());
}
}

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

基本车
完整车
添加一个构造函数,该构造函数采用
参数:

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);
}
接口车{
字符串getModel();
int getYear();
字符串getColor();
int getMaxSpeed();
List getComments();
}
公共级基准车{
私有字符串模型;
私人国际年;
公共基地车(c车){
this.model=c.getModel();
this.year=c.getYear();
}
公共字符串getModel(){
收益模型;
}
公共void集合模型(字符串模型){
this.model=模型;
}
公共int getYear(){
回归年;
}
公共年(国际年){
今年=年;
}
}
公共级FullCar扩展BaseCar{
私有字符串颜色;
私有int-maxSpeed;
私人名单评论;
公共满载车(c车){
超级(c);//设置基础车。
this.maxSpeed=c.getMaxSpeed();
this.color=c.getColor();
this.comments=newarraylist(c.getComments());
}
}
公共基地车toBaseCar(汽车){
返回新的基准车(car);
}
公共整车对整车(汽车){
归还新的整车(car);
}

将构造函数添加到
BaseCar
FullCar
中,该构造函数采用
Car
参数:

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);
}
接口车{
字符串getModel();
int getYear();
字符串getColor();
int getMaxSpeed();
List getComments();
}
公共级基准车{
私有字符串模型;
私人国际年;
公共基地车(c车){
this.model=c.getModel();
this.year=c.getYear();
}
公共字符串getModel(){
收益模型;
}
公共void集合模型(字符串模型){
this.model=模型;
}
公共int getYear(){
回归年;
}
公共年(国际年){
今年=年;
}
}
公共级FullCar扩展BaseCar{
私有字符串颜色;
私有int-maxSpeed;
私人名单评论;
公共满载车(c车){
超级(c);//设置基础车。
this.maxSpeed=c.getMaxSpeed();
this.color=c.getColor();
this.comments=newarraylist(c.getComments());
}
}
公共基地车toBaseCar(汽车){
返回新的基准车(car);
}
公共整车对整车(汽车){
归还新的整车(car);
}

这是一个好主意,我已经考虑过了,但我并不总是在实体和pojo之间有1:1的关系,我不确定是否将逻辑放在一个仅用于共享数据的类中。我的意思是,我当然可以,但我不喜欢。这是一个好主意,我已经考虑过了,但我并不总是在实体和pojo之间有1:1的关系,我不确定是否将逻辑放入一个仅用于共享数据的类中。我是说,我当然可以,但我不喜欢。