Java對象轉換的多種實現方式

Java對象轉換的多種實現方式

在Java開發中,對象轉換是一個常見的需求。特別是在不同層次間傳遞數據時,通常需要將一個對象轉換為另一個對象。雖然JSON序列化/反序列化是一種常見的方法,但在某些場景下可能并不是最佳選擇。本文將總結幾種常見的Java對象轉換實現方式,并提供選擇建議。

技術/工具優點缺點適用場景性能評價學習曲線
手動映射高性能、簡單明了可維護性差,代碼冗余簡單對象轉換,性能關鍵場景??????
Builder模式可讀性好,易擴展增加代碼量,需理解設計模式對象屬性較多,需靈活配置??????
工具類輔助映射增強復用性,集中管理可能導致工具類膨脹,需手動維護多處使用同樣映射邏輯??????
MapStruct性能優越,類型安全需要學習和配置,額外依賴復雜對象映射,性能要求高????????
Spring BeanUtils快速開發,簡單易用性能較低,靈活性有限快速原型開發,簡單對象轉換????
Dozer框架功能強大,支持復雜映射性能較低,學習成本高靈活的映射配置,已有Dozer使用?????
ModelMapper智能映射,簡單易用性能中等,可能需手動調整結構相似對象,快速實現轉換?????
反射機制高度靈活,無需額外依賴性能差,復雜性高需要動態處理屬性的特殊場景????

1. 手動映射(Manual Mapping)

手動映射是最直接的方式,通過手動設置每個屬性來完成對象轉換。這種方式簡單明了,適合于屬性較少的對象。

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

2. Builder模式

Builder模式提供了一種流式API來創建對象,增強了代碼的可讀性和可維護性。

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

3. 工具類輔助映射

通過創建專門的工具類來封裝對象轉換邏輯,增強了代碼的復用性。

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是一個代碼生成器,可以在編譯時生成類型安全的映射代碼,適合于復雜對象映射。

@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工具類,可以快速進行對象屬性復制,適用于快速開發場景。

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

6. 使用Dozer框架

Dozer是一款開源的Java Bean到Java Bean的映射器,支持復雜的映射需求。

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

7. 使用ModelMapper

ModelMapper是一個智能的對象映射工具,適合復雜對象的自動映射。

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

8. 使用反射機制

通過Java反射機制可以動態實現對象轉換,雖然靈活但性能較差。

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);
}

選擇建議

  • 簡單場景:手動映射或Builder模式。
  • 復雜場景:使用MapStruct或ModelMapper。
  • 快速開發:Spring BeanUtils。
  • 高性能要求:手動映射或MapStruct。
  • 靈活性要求高:反射機制。

性能對比

性能從高到低排序如下:

手動映射 > MapStruct > ModelMapper > Dozer > BeanUtils > 反射 > JSON序列化

可維護性對比

可維護性從高到低排序如下:

MapStruct > 手動映射 > ModelMapper > Dozer > BeanUtils > 反射 > JSON序列化

使用建議

  • 對于簡單的DTO轉換,推薦使用手動映射或Builder模式。
  • 對于復雜的對象映射,推薦使用MapStruct。
  • 對于快速開發場景,可以使用Spring BeanUtils。
  • 盡量避免使用JSON序列化/反序列化進行對象轉換。

選擇建議

  • 小型項目或簡單對象:手動映射或Spring BeanUtils。
  • 大型項目或復雜對象轉換:MapStruct。
  • 需要快速出結果:Spring BeanUtils或ModelMapper。
  • 高度靈活的需求:反射機制(謹慎使用)。

每種方式都有其適用場景,開發者需要根據具體需求選擇最合適的實現方式。希望這篇文章能幫助您在項目中做出更好的選擇。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78312.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78312.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78312.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

頭歌實訓之索引

🌟 各位看官好,我是maomi_9526! 🌍 種一棵樹最好是十年前,其次是現在! 🚀 今天來學習C語言的相關知識。 👍 如果覺得這篇文章有幫助,歡迎您一鍵三連,分享給更…

Rundeck 介紹及安裝:自動化調度與執行工具

Rundeck介紹 概述:Rundeck 是什么? Rundeck 是一款開源的自動化調度和任務執行工具,專為運維場景設計,幫助工程師通過統一的平臺管理和執行跨系統、跨節點的任務。它由 PagerDuty 維護(2016 年收購)&#…

基于 Python 的自然語言處理系列(85):PPO 原理與實踐

📌 本文介紹如何在 RLHF(Reinforcement Learning with Human Feedback)中使用 PPO(Proximal Policy Optimization)算法對語言模型進行強化學習微調。 🔗 官方文檔:trl PPOTrainer 一、引言&…

珍愛網:從降本增效到綠色低碳,數字化新基建價值凸顯

2024年12月24日,法大大聯合企業綠色發展研究院發布《2024簽約減碳與低碳辦公白皮書》,深入剖析電子簽在推動企業綠色低碳轉型中的關鍵作用,為企業實現環境、社會和治理(ESG)目標提供新思路。近期,法大大將陸…

Java實現HTML轉PDF(deepSeekAi->html->pdf)

Java實現HTML轉PDF,主要為了解決將ai返回的html文本數據轉為PDF文件方便用戶下載查看。 一、deepSeek-AI提問詞 基于以上個人數據。總結個人身體信息,分析個人身體指標信息。再按一個月為維度,詳細列舉一個月內訓練計劃,維度詳細至每周每天…

Estimands與Intercurrent Events:臨床試驗與統計學核心框架

1. Estimands(估計目標)概述 1.1 定義與作用 1.1.1 定義 Estimand是臨床試驗中需明確提出的科學問題,即研究者希望通過數據估計的“目標量”,定義“治療效應”具體含義,確保分析結果與臨床問題一致。 例如,在研究某種新藥對高血壓患者降壓效果時,Estimand可定義為“在…

Jsp技術入門指南【十】IDEA 開發環境下實現 MySQL 數據在 JSP 頁面的可視化展示,實現前后端交互

Jsp技術入門指南【十】IDEA 開發環境下實現 MySQL 數據在 JSP 頁面的可視化展示,實現前后端交互 前言一、JDBC 核心接口和類:數據庫連接的“工具箱”1. 常用的 2 個“關鍵類”2. 必須掌握的 5 個“核心接口” 二、創建 JDBC 程序的步驟1. 第一步&#xf…

深入理解HotSpot JVM 基本原理

關于JAVA Java編程語言是一種通用的、并發的、面向對象的語言。它的語法類似于C和C++,但它省略了許多使C和C++復雜、混亂和不安全的特性。 Java 是幾乎所有類型的網絡應用程序的基礎,也是開發和提供嵌入式和移動應用程序、游戲、基于 Web 的內容和企業軟件的全球標準。. 從…

【HTTP/3:互聯網通信的量子飛躍】

HTTP/3:互聯網通信的量子飛躍 如果說HTTP/1.1是鄉村公路,HTTP/2是現代高速公路系統,那么HTTP/3就像是一種革命性的"傳送門"技術,它徹底重寫了數據傳輸的底層規則,讓信息幾乎可以瞬間抵達目的地,…

Apipost免費版、企業版和私有化部署詳解

Apipost是企業級的 API 研發協作一體化平臺,為企業提供 API研發測試管理全鏈路解決方案,不止于API研發場景,增強企業API資產管理。 Apipost 基于同一份數據源,同時提供給后端開發、前端開發、測試人員使用的接口調試、Mock、自動化…

使用若依二次開發商城系統-1:搭建若依運行環境

前言 若依框架有很多版本,這里使用的是springboot3vue3這樣的一個前后端分離的版本。 一.操作步驟 1 下載springboot3版本的后端代碼 后端springboot3的代碼路徑,https://gitee.com/y_project/RuoYi-Vue 需要注意我們要的是springboot3分支。 先用g…

速成GO訪問sql,個人筆記

更多個人筆記:(僅供參考,非盈利) gitee: https://gitee.com/harryhack/it_note github: https://github.com/ZHLOVEYY/IT_note 本文是基于原生的庫 database/sql進行初步學習 基于ORM等更多操作可以關注我…

【C++指南】告別C字符串陷阱:如何實現封裝string?

🌟 各位看官好,我是egoist2023! 🌍 種一棵樹最好是十年前,其次是現在! 💬 注意:本章節只詳講string中常用接口及實現,有其他需求查閱文檔介紹。 🚀 今天通過了…

系統架構師2025年論文《論軟件架構評估2》

論軟件系統架構評估 v2.0 摘要: 某市醫院預約掛號系統建設推廣應用項目是我市衛生健康委員會 2019 年發起的一項醫療衛生行業便民惠民信息化項目,目的是實現轄區內患者在轄區各公立醫療機構就診時,可以通過多種線上渠道進行預約掛號,提升就醫體驗。我作為系統架構師參與此…

BEVDet4D: Exploit Temporal Cues in Multi-camera 3D Object Detection

背景 對于現有的BEVDet方法,它對于速度的預測誤差要高于基于點云的方法,對于像速度這種與時間有關的屬性,僅靠單幀數據很難預測好。因此本文提出了BEVDet4D,旨在獲取時間維度上的豐富信息。它是在BEVDet的基礎上進行拓展,保留了之前幀的BEV特征,并將其進行空間對齊后與當…

el-upload 上傳邏輯和ui解耦,上傳七牛

解耦的作用在于如果后面要我改成從阿里云oss上傳文件,我只需要實現上傳邏輯從七牛改成阿里云即可,其他不用動。實現方式有2部分組成,一部分是上傳邏輯,一部分是ui。 上傳邏輯 大概邏輯就是先去服務端拿上傳token和地址&#xff0…

酒水類目電商代運營公司-品融電商:全域策略驅動品牌長效增長

酒水類目電商代運營公司-品融電商:全域策略驅動品牌長效增長 在競爭日益激烈的酒水市場中,品牌如何快速突圍并實現長效增長?品融電商憑借「效品合一 全域增長」方法論與全鏈路運營能力,成為酒水類目代運營的領跑者。從品牌定位、視…

機器學習特征工程中的數值分箱技術:原理、方法與實例解析

標題:機器學習特征工程中的數值分箱技術:原理、方法與實例解析 摘要: 分箱技術作為機器學習特征工程中的關鍵環節,通過將數值數據劃分為離散區間,能夠有效提升模型對非線性關系的捕捉能力,同時增強模型對異…

【MySQL專欄】MySQL數據庫的復合查詢語句

文章目錄 1、首先練習MySQL基本語句的練習①查詢工資高于500或崗位為MANAGER的雇員,同時還要滿足他們的姓名首字母為大寫的J②按照部門號升序而雇員的工資降序排序③使用年薪進行降序排序④顯示工資最高的員工的名字和工作崗位⑤顯示工資高于平均工資的員工信息⑥顯…

Python爬蟲(5)靜態頁面抓取實戰:requests庫請求頭配置與反反爬策略詳解

目錄 一、背景與需求?二、靜態頁面抓取的核心流程?三、requests庫基礎與請求頭配置?3.1 安裝與基本請求3.2 請求頭核心參數解析?3.3 自定義請求頭實戰 四、實戰案例:抓取豆瓣讀書Top250?1. 目標?2. 代碼實現3. 技術要點? 五、高階技巧與反反爬策略?5.1 動態…