Java 创建并填充T类对象或从T扩展而来的对象的属性,而不使用重复代码
我开发了一个JavaEE应用程序,提供REST服务。我决定永远不公开底层实体,使用POJO发送数据。当用户请求列表时,应用程序会发送一个包含最少信息的POJO列表,但如果用户请求特定资源,他将获得更详细的POJO。 例如,假设我有一辆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
汽车
实体,我可以有:
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的关系,我不确定是否将逻辑放入一个仅用于共享数据的类中。我是说,我当然可以,但我不喜欢。