僅寫給自己看看吧,以後在敲代碼的時候注意一些!
列舉一些文法、邏輯在使用的時候可能忽略的小細節!雖然不太實用,這些問題在報錯的時候Debug都能發現,當然為了提高效率,使用BeanUtils.copyProperties的時候還是有這個意識吧!
1.BeanUtils.copyProperties(aDom,bDom);
- 如果有兩個具有很多相同屬性的JavaBean,一個很常見的情況就是Struts裡的PO對象(持久對象)和對應的ActionForm。例如:一個使用者注冊頁面,有一個User實體類和一個UserActionForm,我們一般會在Action裡從ActionForm構造一個PO對象,傳統的方式是使用類似下面的語句對屬性逐個指派:
例如:A表示含有屬性,a表示不含有!
屬性 | name | age | sex | high | weight | tennis | bsket |
---|---|---|---|---|---|---|---|
aDom | A | A | A | A | A | a | a |
bDom | A | A | A | A | A | A | A |
- 問題:假設我們要将aDom的屬性對應傳到bDom裡面去
傳統方法:
//向bDom中設定aDom中含有的屬性
bDom.setName(aDom.getName);
bDom.setAge(aDom.getAge);
bDom.setSex(aDom.getSex);
bDom.setHigh(aDom.getHigh);
bDom.setWeight(aDom.getWeight);
bDom.setName(aDom.getName);
簡便方法:
//向bDom中設定aDom中含有的屬性
BeanUtils.copyProperties(aDom,bDom);
- 如果使用傳統的方法,Bean裡面的屬性太多的話,那就變得不現實了,是以BeansUtil.copyProperties簡化了很多,一條代碼便搞定!
容易遺漏的小細節來了:
-
1、很多時候我們在拷貝了屬性以後容易忘記單獨設定剩下兩個屬性!
是以在以上代碼完成的時候,需要單獨添加屬性!
處理方法:
BeanUtils.copyProperties(aDom,bDom);
bDom.setTennis("網球");
bBom.setBsket("籃球");
- 2、假如我們的兩個類是資料傳輸類,兩個都擁有相同的屬性,但有着不同的初始值!如下
屬性 | name | age | sex | high | weight | tennis | bsket |
---|---|---|---|---|---|---|---|
aDom | aa | 12 | 男 | 178 | 58 | Null | Null |
bDom | Null | Null | Null | Null | Null | Null | Null |
在表中tennis和bsket都是沒有值的!需要我們單獨指派,在克服第一個疏忽之後我們還可能疏忽的是代碼順序!
bDom.setTennis("網球");
bBom.setBsket("籃球");
BeanUtils.copyProperties(aDom,bDom);
- 當我們使用上面代碼的時候,最後你會發現你賦的值變為了Null ,為什麼呢?其實細細理一下思路就能發現!我們使用BeanUtils.copyProperties複制屬性的時候aDom的Null值将你set的值給覆寫了!
- 處理方法也很簡單:
//隻需要調整一下代碼順序即可,先copy再指派,就不會被覆寫了!
BeanUtils.copyProperties(aDom,bDom);
bDom.setTennis("網球");
bDom.setBsket("籃球");
- 3、還有一種容易忽略的情況,和第二種差不多!兩者屬性預設值如下:
屬性 | name | age | sex | high | weight | tennis | bsket |
---|---|---|---|---|---|---|---|
aDom | aa | Null | 男 | Null | 58 | Null | Null |
bDom | Null | 18 | Null | 185l | Null | Null | Null |
在避免1、2兩種疏忽之後,第三種其實也很簡單,兩者預設屬性有交叉的!在将aDom的屬性copy到bDom的時候,aDom其本身的Null屬性會覆寫掉bDom已有的屬性!這個時候如果采用BeanUtils.copyProperties複制屬性的時候,age和high不可避免需要單獨set指派。
解決方法:
BeanUtils.copyProperties(aDom,bDom);
bDom.setAge("18");
bDom.setHigh("185");
bDom.setTennis("網球");
bDom.setBsket("籃球");
綜上所述,如果使用BeanUtils.copyProperties,有需要單獨指派的屬性盡量放在copy語句的後面,防止copy的時候被覆寫掉!當然使用BeanUtils.copyProperties隻能拷貝屬性名字相同的屬性,如果對應的屬性名稱不一樣的話就需要我們自定義converter對象轉換工具類了!
聲明:本文為作者學習心得,養成記錄學習的好習慣吧!如有錯誤,望指正,謝謝!