BeanUtil和mapStruct和Orika
最近接手了一個(gè)其他組的項(xiàng)目,發(fā)現(xiàn)在項(xiàng)目中對(duì)象映射上竟然采用了三種不同方法:BeanUtil, Orika和MapStruct。BeanUtil是Spring框架自帶的映射工具, Orika和Mapstruct是開源的對(duì)象映射的兩種方法。下面的代碼分別使用不同的方式進(jìn)行對(duì)象映射
//BeanUtilBeanUtils.copyProperties(a, b)//Orikaprivate static final MapperFacade FACADE = new DefaultMapperFactory.Builder().build().getMapperFacade(); b = FACADE.map(a, B.class);//MapStructpublic interface Converter { ? ?Converter INSTANCE = Mappers.getMapper(Converter.class); ? ?B b = convertToEntity(A a);
對(duì)比
如果只是對(duì)比代碼量,BeanUils的方式是最簡(jiǎn)單的,代碼量最少,但是在實(shí)際的工作場(chǎng)景中會(huì)發(fā)現(xiàn)使用BeanUils是最坑的,比如傳了Null的對(duì)象進(jìn)去,就會(huì)報(bào)NPE的錯(cuò)誤,需要在映射前進(jìn)行判空的處理。下面是對(duì)三種方式的比較。
BeanUtils
優(yōu)點(diǎn)
易于使用和配置。
不需要進(jìn)行手動(dòng)配置。
支持復(fù)制對(duì)象的屬性。
缺點(diǎn)
映射速度較慢,因?yàn)樗褂梅瓷鋪慝@取和設(shè)置屬性。
在處理復(fù)雜映射場(chǎng)景時(shí)可能會(huì)出現(xiàn)問題。
不支持自定義轉(zhuǎn)換器和過濾器。
Orika
優(yōu)點(diǎn)
映射速度非??欤?yàn)樗褂米止?jié)碼生成來創(chuàng)建映射器。
支持復(fù)雜的映射場(chǎng)景,例如嵌套對(duì)象和集合映射。
可以通過自定義轉(zhuǎn)換器和過濾器來進(jìn)行高度個(gè)性化的映射。
易于使用和配置。
缺點(diǎn)
Orika的字節(jié)碼生成可能會(huì)導(dǎo)致應(yīng)用程序的啟動(dòng)時(shí)間變慢。
需要在運(yùn)行時(shí)生成字節(jié)碼,這可能會(huì)影響應(yīng)用程序的性能。
需要對(duì)映射器進(jìn)行手動(dòng)配置。
MapStruct
優(yōu)點(diǎn)
映射速度非???,因?yàn)樗褂镁幾g時(shí)生成的代碼。
支持復(fù)雜的映射場(chǎng)景,例如嵌套對(duì)象和集合映射。
可以通過自定義轉(zhuǎn)換器和過濾器來進(jìn)行高度個(gè)性化的映射。
易于使用和配置。
缺點(diǎn)
MapStruct的編譯時(shí)代碼生成可能會(huì)導(dǎo)致編譯時(shí)間變長(zhǎng)。
需要對(duì)映射器進(jìn)行手動(dòng)配置。
當(dāng)選擇這些工具中的一個(gè)時(shí),應(yīng)該考慮應(yīng)用程序的特定需求。如果應(yīng)用程序需要高性能和復(fù)雜的映射場(chǎng)景,則可以選擇Orika或MapStruct。如果應(yīng)用程序需要簡(jiǎn)單的屬性復(fù)制,則可以選擇BeanUtils。在Orika和MapStruct之間進(jìn)行選擇時(shí),應(yīng)該考慮是否更關(guān)注應(yīng)用程序的啟動(dòng)時(shí)間還是編譯時(shí)間。
代碼可讀性
從代碼可讀性和重構(gòu)的角度來看,個(gè)人認(rèn)為MapStruct是最佳選擇。
MapStruct的代碼生成是在編譯時(shí)完成的,這意味著它生成的代碼可以與手動(dòng)編寫的代碼一樣清晰和易于理解。此外,MapStruct生成的代碼易于重構(gòu)和維護(hù),因?yàn)樗鼈兣c手動(dòng)編寫的代碼沒有區(qū)別。
相比之下,Orika和BeanUtils生成的代碼通常比手寫的代碼難以閱讀和理解,這可能會(huì)導(dǎo)致在重構(gòu)和維護(hù)代碼時(shí)出現(xiàn)問題。Orika的字節(jié)碼生成也可能會(huì)使代碼變得更加復(fù)雜和難以調(diào)試。
面試大全超級(jí)詳細(xì)!!
java面試大全:
搜索公眾號(hào)回復(fù)eee003獲取?
