2012-06-25 88 views
2

在推土機我如何在全球範圍初始化值空對象,而不是空推土機 - 空對象,而不是空

對於前:

Class Person 
{ 
public Address address; 
//getters and setters for address 

} 

Class Address 
{ 
String addressField1; 
String addressField2; 
} 

同樣地,我都對象PersonVO和AddressVO相類似的人和地址

使用推土機映射值後,如果地址值是Person對象爲null,比結果personvo.getAddressVO.getAddressField1()將拋出空指針異常,是有什麼辦法避免這一點?

如果我使用定製的轉換比我做的自定義轉換設置值的典型方式結束,並會破壞使用推土機的目的。

回答

0

如果你可以修改PersonVO類的setter方法,你可以做如下:

public void setAddressVO(AddressVO address) { 
    this.addressVO = address == null ? new AddressVO() : address; 
} 

因此,你一定會認爲該領域addressVO從不null

請注意,這是比較髒的原因是:

  1. 如果一個人有沒有地址,其地址字段應該是null 而不是空AddressVO對象。
  2. 像 這樣的自定義設置器這是一個不好的做法,因爲您班級的大多數用戶會期望 set方法設置值並且什麼都不做。您可以選擇 創建一個新的方法initAddressVO和配置文件中使用set-method屬性從推土機 調用此方法。

這將是更好的(如果可能的話),以檢查是否地址爲null一些if避免NullPointerException

不具有任何非靜態數據成員
+0

我有類似的想法,檢查null的問題是,要訪問'personvo.getAddressVO()。getAddressField1()'的代碼是從某個工具生成的代碼,我不確定它是否有選項生成空檢查。 –

0

對象被稱爲空的對象,因爲所有的非靜態數據成員居住的內部對象堆。所以如果我們沒有任何非靜態數據成員,我們有空的對象。但不是NULL。

空對象: 對象不具有任何非靜態數據成員。

空對象:其不具有任何參考即空引用 對象;

0

有一種方法可以在Dozer中初始化目標對象。

  1. 定義一個工廠類爲目標對象。
  2. 指定目標對象的create-method作爲上述工廠類中的方法。

舉個例子,我想你想把Person映射到PersonVO和Address映射到AddressVO。

爲PersonVO

創建一個工廠類
public abstract class PersonVOFactory { 
    private PersonVOFactory() { 
    } 
    public static PersonVO createPersonVO() { 
     PersonVO personVO = new PersonVO(); 
     personVO.setAddressVO(new AddressVO()); 
     return personVO; 
    } 
} 

指定上述創建系人PersonVO映射方法。

<mapping map-id="person-mapping"> 
    <class-a>Person</class-a> 
    <class-b create-method="PersonVOFactory.createPersonVO">PersonVO</class-b> 
    <field> 
     <a>address.addressField1</a> 
     <b>addressVO.addressField1</b> 
    </field> 
    <field> 
     <a>address.addressField2</a> 
     <b>addressVO.addressField2</b> 
    </field> 
</mapping> 

現在聲明personvo.getAddressVO.getAddressField1()不會拋出NPE。