天天看點

敲代碼的時候你可能忽略的一些小細節(篇一)

僅寫給自己看看吧,以後在敲代碼的時候注意一些!

列舉一些文法、邏輯在使用的時候可能忽略的小細節!雖然不太實用,這些問題在報錯的時候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對象轉換工具類了!

聲明:本文為作者學習心得,養成記錄學習的好習慣吧!如有錯誤,望指正,謝謝!