2016-08-18 7 views
0

REST 서비스를 제공하는 Java EE 앱을 개발했습니다. POJO를 사용하여 데이터를 전송하는 기본 엔티티를 노출시키지 않기로 결정했습니다. 사용자가 목록을 요청하면 앱은 최소한의 정보로 POJO 목록을 전송하지만 사용자가 특정 리소스를 요청하면 POJO가 더 자세하게 표시됩니다. 예를 들어, 나는 Car 실체가 상상 , 나는이있을 수 있습니다 :클래스 T의 객체의 속성을 만들고 채우거나 중복 코드없이 T에서 확장했습니다.

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...] 
} 

을 따라서 사용자의 통화/자동차 그가 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에 캐스팅하는 것은 불가능합니다. 동일한 코드 블록을 반복하지 않도록하는 방법이 있습니까?

답변

2

BaseCarCar 매개 변수 걸릴 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); 
} 
+0

이 좋은 생각이고 나는 이미 그것에 대해 생각했다, 그러나 항상 나는 일이 있습니다 사이 1 관계를 엔티티 및 pojo와 나는 데이터 공유에만 사용하는 클래스에 논리를 두는 것이 확실하지 않습니다. 내 말은, 물론 할 수 있지만, 나는 그것을 좋아하지 않는다. –