1. 程式人生 > >慎用BeanUtils的物件拷貝方法

慎用BeanUtils的物件拷貝方法

javaWeb開發過程中,經常需要在領域類之間進行實體物件的拷貝操作,比如把Po類的屬性值拷貝給Dto類。

BeanUtils這種工具類應用而生,比如org.apache.commons包中的BeanUtils就提供copyProperties(Object dest, Object orig)方法,它方便開發者快速在倆個物件之間進行欄位值的拷貝。而且,拷貝條件非常簡單:拷貝實體類之間只要保證欄位名稱一樣即可。

儘管BeanUtils好用而且便捷,將開發者從繁重的get set操作中解放出來,但是筆者不太推薦使用他,原因有三。

1、欄位名必須一樣

雖然倆個拷貝類之間,需要拷貝的屬性欄位名必須要一樣,當它們欄位值不一樣的時候,這時候就需要手動獲取並賦值。當倆個實體類存在個別欄位不一樣時開發者容易忽視他,而忘記手動設定。

比如Po類的使用者名稱叫 uName(資料庫欄位u_name),而Dto類因為是給其他模組呼叫的所以寫有閱讀意義的全程userName,這時候我們就必須手動設定
dtoObj.setUserName(poObj.getuName())

2、效能問題

BeanUtils內部實現採用的是反射功能,當反射的運算元量達到萬級別的話,耗時非常明顯。筆者親自試過,對五萬條資料進行拷貝操作,能明顯感覺到卡頓。所以說BeanUtils是一個用效能換時間的得不償失的買賣。

3、泛型擦除問題

在進行集合直接的資料拷貝時,因為泛型擦除問題,導致拷貝失效。比如我們需要將Po集合列表轉化為Dto的集合,因為泛型擦除問題,最終得到的還是Po的集合。