欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java對(duì)象轉(zhuǎn)換的實(shí)現(xiàn)方式匯總

 更新時(shí)間:2025年04月26日 12:28:12   作者:北漂老男人  
這篇文章主要介紹了Java對(duì)象轉(zhuǎn)換的多種實(shí)現(xiàn)方式,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

Java對(duì)象轉(zhuǎn)換的多種實(shí)現(xiàn)方式

在Java開(kāi)發(fā)中,對(duì)象轉(zhuǎn)換是一個(gè)常見(jiàn)的需求。特別是在不同層次間傳遞數(shù)據(jù)時(shí),通常需要將一個(gè)對(duì)象轉(zhuǎn)換為另一個(gè)對(duì)象。雖然JSON序列化/反序列化是一種常見(jiàn)的方法,但在某些場(chǎng)景下可能并不是最佳選擇。本文將總結(jié)幾種常見(jiàn)的Java對(duì)象轉(zhuǎn)換實(shí)現(xiàn)方式,并提供選擇建議。

技術(shù)/工具優(yōu)點(diǎn)缺點(diǎn)適用場(chǎng)景性能評(píng)價(jià)學(xué)習(xí)曲線
手動(dòng)映射高性能、簡(jiǎn)單明了可維護(hù)性差,代碼冗余簡(jiǎn)單對(duì)象轉(zhuǎn)換,性能關(guān)鍵場(chǎng)景??????
Builder模式可讀性好,易擴(kuò)展增加代碼量,需理解設(shè)計(jì)模式對(duì)象屬性較多,需靈活配置??????
工具類輔助映射增強(qiáng)復(fù)用性,集中管理可能導(dǎo)致工具類膨脹,需手動(dòng)維護(hù)多處使用同樣映射邏輯??????
MapStruct性能優(yōu)越,類型安全需要學(xué)習(xí)和配置,額外依賴復(fù)雜對(duì)象映射,性能要求高????????
Spring BeanUtils快速開(kāi)發(fā),簡(jiǎn)單易用性能較低,靈活性有限快速原型開(kāi)發(fā),簡(jiǎn)單對(duì)象轉(zhuǎn)換????
Dozer框架功能強(qiáng)大,支持復(fù)雜映射性能較低,學(xué)習(xí)成本高靈活的映射配置,已有Dozer使用?????
ModelMapper智能映射,簡(jiǎn)單易用性能中等,可能需手動(dòng)調(diào)整結(jié)構(gòu)相似對(duì)象,快速實(shí)現(xiàn)轉(zhuǎn)換?????
反射機(jī)制高度靈活,無(wú)需額外依賴性能差,復(fù)雜性高需要?jiǎng)討B(tài)處理屬性的特殊場(chǎng)景????

1. 手動(dòng)映射(Manual Mapping)

手動(dòng)映射是最直接的方式,通過(guò)手動(dòng)設(shè)置每個(gè)屬性來(lái)完成對(duì)象轉(zhuǎn)換。這種方式簡(jiǎn)單明了,適合于屬性較少的對(duì)象。

TargetObject target = new TargetObject();
target.setPropertyA(source.getPropertyA());
target.setPropertyB(source.getPropertyB());
// ...

2. Builder模式

Builder模式提供了一種流式API來(lái)創(chuàng)建對(duì)象,增強(qiáng)了代碼的可讀性和可維護(hù)性。

TargetObject target = TargetObject.builder()
    .propertyA(source.getPropertyA())
    .propertyB(source.getPropertyB())
    .build();

3. 工具類輔助映射

通過(guò)創(chuàng)建專門的工具類來(lái)封裝對(duì)象轉(zhuǎn)換邏輯,增強(qiáng)了代碼的復(fù)用性。

public class ObjectMapper {
    public static TargetObject map(SourceObject source) {
        TargetObject target = new TargetObject();
        target.setPropertyA(source.getPropertyA());
        target.setPropertyB(source.getPropertyB());
        return target;
    }
}

4. 使用MapStruct框架

MapStruct是一個(gè)代碼生成器,可以在編譯時(shí)生成類型安全的映射代碼,適合于復(fù)雜對(duì)象映射。

@Mapper
public interface ObjectMapper {
    ObjectMapper INSTANCE = Mappers.getMapper(ObjectMapper.class);
    @Mapping(source = "propertyA", target = "propertyA")
    @Mapping(source = "propertyB", target = "propertyB")
    TargetObject map(SourceObject source);
}

5. 使用Spring BeanUtils/CopyProperties

Spring提供了BeanUtils工具類,可以快速進(jìn)行對(duì)象屬性復(fù)制,適用于快速開(kāi)發(fā)場(chǎng)景。

TargetObject target = new TargetObject();
BeanUtils.copyProperties(source, target);

6. 使用Dozer框架

Dozer是一款開(kāi)源的Java Bean到Java Bean的映射器,支持復(fù)雜的映射需求。

Mapper mapper = new DozerBeanMapper();
TargetObject target = mapper.map(source, TargetObject.class);

7. 使用ModelMapper

ModelMapper是一個(gè)智能的對(duì)象映射工具,適合復(fù)雜對(duì)象的自動(dòng)映射。

ModelMapper modelMapper = new ModelMapper();
TargetObject target = modelMapper.map(source, TargetObject.class);

8. 使用反射機(jī)制

通過(guò)Java反射機(jī)制可以動(dòng)態(tài)實(shí)現(xiàn)對(duì)象轉(zhuǎn)換,雖然靈活但性能較差。

Field[] fields = source.getClass().getDeclaredFields();
for (Field field : fields) {
    field.setAccessible(true);
    Object value = field.get(source);
    Field targetField = target.getClass().getDeclaredField(field.getName());
    targetField.setAccessible(true);
    targetField.set(target, value);
}

選擇建議

  • 簡(jiǎn)單場(chǎng)景:手動(dòng)映射或Builder模式。
  • 復(fù)雜場(chǎng)景:使用MapStruct或ModelMapper。
  • 快速開(kāi)發(fā):Spring BeanUtils。
  • 高性能要求:手動(dòng)映射或MapStruct。
  • 靈活性要求高:反射機(jī)制。

性能從高到低排序如下:

手動(dòng)映射 > MapStruct > ModelMapper > Dozer > BeanUtils > 反射 > JSON序列化

可維護(hù)性對(duì)比

可維護(hù)性從高到低排序如下:

MapStruct > 手動(dòng)映射 > ModelMapper > Dozer > BeanUtils > 反射 > JSON序列化

使用建議

  • 對(duì)于簡(jiǎn)單的DTO轉(zhuǎn)換,推薦使用手動(dòng)映射或Builder模式。
  • 對(duì)于復(fù)雜的對(duì)象映射,推薦使用MapStruct。
  • 對(duì)于快速開(kāi)發(fā)場(chǎng)景,可以使用Spring BeanUtils。
  • 盡量避免使用JSON序列化/反序列化進(jìn)行對(duì)象轉(zhuǎn)換。

選擇建議

  • 小型項(xiàng)目或簡(jiǎn)單對(duì)象:手動(dòng)映射或Spring BeanUtils。
  • 大型項(xiàng)目或復(fù)雜對(duì)象轉(zhuǎn)換:MapStruct。
  • 需要快速出結(jié)果:Spring BeanUtils或ModelMapper。
  • 高度靈活的需求:反射機(jī)制(謹(jǐn)慎使用)。

每種方式都有其適用場(chǎng)景,開(kāi)發(fā)者需要根據(jù)具體需求選擇最合適的實(shí)現(xiàn)方式。希望這篇文章能幫助您在項(xiàng)目中做出更好的選擇。

到此這篇關(guān)于Java對(duì)象轉(zhuǎn)換的多種實(shí)現(xiàn)方式的文章就介紹到這了,更多相關(guān)Java對(duì)象轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis學(xué)習(xí)教程之開(kāi)發(fā)Dao的方法教程

    MyBatis學(xué)習(xí)教程之開(kāi)發(fā)Dao的方法教程

    這篇文章主要給大家介紹了關(guān)于MyBatis開(kāi)發(fā)Dao的相關(guān)資料,使用Mybatis開(kāi)發(fā)Dao,通常有兩個(gè)方法,即原始Dao開(kāi)發(fā)方法和Mapper接口開(kāi)發(fā)方法。文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面來(lái)一起看看吧。
    2017-07-07
  • MyBatis 參數(shù)類型為String時(shí)常見(jiàn)問(wèn)題及解決方法

    MyBatis 參數(shù)類型為String時(shí)常見(jiàn)問(wèn)題及解決方法

    這篇文章主要介紹了MyBatis 參數(shù)類型為String時(shí)常見(jiàn)問(wèn)題及解決方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-03-03
  • Java?協(xié)程?Quasar詳解

    Java?協(xié)程?Quasar詳解

    這篇文章主要介紹了Java?協(xié)程?Quasar詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 詳細(xì)解讀Hibernate的緩存機(jī)制

    詳細(xì)解讀Hibernate的緩存機(jī)制

    這篇文章主要介紹了詳細(xì)解讀Hibernate的緩存機(jī)制,具有一定參考價(jià)值,這里分享給大家,供大家學(xué)習(xí)參閱。
    2017-10-10
  • java跳板執(zhí)行ssh命令方式

    java跳板執(zhí)行ssh命令方式

    本文分享了在Java中使用跳板機(jī)執(zhí)行SSH命令的方法,并推薦了一些Maven依賴,希望這些信息對(duì)大家有所幫助
    2024-12-12
  • Java 1.0和Java 1.1 的IO類的比較

    Java 1.0和Java 1.1 的IO類的比較

    Java庫(kù)的IO分為輸入/輸出兩部分。早期的Java 1.0版本的輸入系統(tǒng)是InputStream及其子類,輸出系統(tǒng)是OutputStream及其子類。后來(lái)的Java 1.1版本對(duì)IO系統(tǒng)進(jìn)行了重新設(shè)計(jì)。本分對(duì)此做了分析和比較,有利于學(xué)習(xí),最后給出了例子。
    2013-11-11
  • Spring Boot如何通過(guò)java -jar啟動(dòng)

    Spring Boot如何通過(guò)java -jar啟動(dòng)

    大家開(kāi)發(fā)的基于Spring Boot 的應(yīng)用 ,jar形式, 發(fā)布的時(shí)候,絕大部分都是使用java -jar 啟動(dòng)。本文主要介紹了Spring Boot如何通過(guò)java -jar啟動(dòng),一起來(lái)了解一下
    2021-05-05
  • 使用@Autowired可以注入ApplicationContext

    使用@Autowired可以注入ApplicationContext

    這篇文章主要介紹了使用@Autowired可以注入ApplicationContext問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Java中OkHttp 超時(shí)設(shè)置的實(shí)現(xiàn)

    Java中OkHttp 超時(shí)設(shè)置的實(shí)現(xiàn)

    超時(shí)設(shè)置是網(wǎng)絡(luò)編程中不可忽視的一部分,本文就來(lái)介紹一下Java中OkHttp 超時(shí)設(shè)置的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 使用MyBatis的動(dòng)態(tài)SQL注解實(shí)現(xiàn)實(shí)體的CRUD操作代碼

    使用MyBatis的動(dòng)態(tài)SQL注解實(shí)現(xiàn)實(shí)體的CRUD操作代碼

    在使用MyBatis進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),動(dòng)態(tài)SQL注解提供了一種優(yōu)雅的方式來(lái)編寫(xiě)動(dòng)態(tài)SQL語(yǔ)句,MyBatis?3.x?版本提供了下四個(gè)CRUD的高級(jí)注解,這些注解可以幫助開(kāi)發(fā)者在Mapper接口中動(dòng)態(tài)地構(gòu)建SQL語(yǔ)句,本文給大家介紹了使用MyBatis的動(dòng)態(tài)SQL注解實(shí)現(xiàn)實(shí)體的CRUD操作
    2024-06-06

最新評(píng)論