2011-07-24 63 views
2

我想實現一種傳輸對象模式。所以,我有一個方法通過BeanUtils.copyProperties(..,..)(apache common)來填充對象的屬性。java通用演員問題

下面是代碼:

public abstract class BaseTO<TObject> { 

    public Long id; 

    /*** 
    * Obtains id of the object that´s transfered 
    * @return object´s id 
    */ 
    public Long getId() { 
     return id; 
    } 

    /**** 
    * set transfered object´s id 
    * @param id object´s id 
    */ 
    public void setId(Long id) { 
     this.id = id; 
    } 

    /*** 
    * Fill transfer object properties. 
    * @param entity entity to be transfered 
    * @return self reference 
    */ 
    public BaseTO<TObject> build(TObject entity){ 
     try { 
      BeanUtils.copyProperties(this, entity); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     customDataTransformation(entity); 
     return this; 
    } 

    protected void customDataTransformation(TObject entity) { 
    } 


} 

CustomerTO類

public class CustomerTO extends BaseTO<Customer> { 

    private String name; 
    private String surname; 
    private String email; 
    private String sex; 
    private DocumentType documentType; 
    private String documentNumber; 

    --- getters and setters 

    @Override 
    protected void customDataTransformation(Customer entity) { 
     this.sex = Sex.MALE.equals(entity.getSex()) ? "M" : "F"; 
    } 


} 

問題

CustomerTO toEdit = (CustomerTO) (customerId!=null ? new CustomerTO().build(entityObject):new CustomerTO()); 

,你可以在這裏看到要投給(CustomerTO)。如果可能的話,我希望避免這種情況,以使代碼更簡單。

public baseTO build(TObject entity)是否可以返回子類的對象?

我希望能夠清楚。

在此先感謝。

+0

你是否因爲想跳過1次小演員而寫出所有這些? – toto2

+0

@toto:我認爲這個問題不僅僅是關於轉換,而是關於編譯時類型檢查。 +1的問題。 –

+0

@toto。不,我會在很多地方使用。 –

回答

1

也許試試這個:

class BaseTO<TObject, R extends BaseTO<TObject,R>> { 

    public R build(TObject entity) { 

然後CustomerTO:

class CustomerTO extends BaseTO<Customer, CustomerTO> { 

以下限制性,只改變build簽名:

public <X extends BaseTO<TObject>> X build(TObject entity) { 

但恕我直言,更好的方法將是簡單地用TObject參數向TO添加構造函數。

public BaseTO(TObject entity) { 
     try { 
      BeanUtils.copyProperties(this, entity); 
     } catch (IllegalAccessException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     customDataTransformation(entity); 
} 

然後在每個擴展的類創建簡單的構造

 public CustomerTO(Customer entity) { 
     super(entity); 
    } 

,忘了build方法,並用它只是

CustomerTO toEdit = (customerId!=null ? new CustomerTO(entityObject):new CustomerTO()); 
+0

我會用你最後的約。 –

1

這編譯:

public class BaseTO<T> { 

    public BaseTO<T> build(T entity) { 
     return this; 
    } 

    public static class CustomerTO extends BaseTO<String> { 

     @Override public CustomerTO build(String string) { 
      return (CustomerTO) super.build(string); 
     } 
} 

但您將必須覆蓋BaseTO的所有子類的build。您只會明確寫出演員一次,而不是每次撥打build

編輯:在上面的評論中看到@Paul提出的觀點。你可能會遭受「給一個男人一把錘子,一切看起來像釘子」。