2016-08-18 10 views
0

Я разработал приложение Java EE, предлагающее услуги REST. Я решил никогда не раскрывать базовые объекты, используя 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

Добавьте конструктор в 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); 
} 
+0

Это хорошая идея, и я уже думаю об этом, но не всегда у меня есть 1: 1 отношения между сущности и pojo, и я не уверен, что ставил логику в классе, который я использую только для обмена данными. Я имею в виду, конечно, могу, но мне это не нравится. –