亚洲中文字幕乱码亚洲-蜜桃成熟视频在线观看-免费中文字幕视频在线-中国五十路熟妇洗澡视频-亚洲av伊人啪啪c-国产精品成人一区二区-国产自拍视频一区在线观看-成人一区不卡二区三区四区-亚洲情精品中文字幕99在线

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

Java DTO改造實錄:1個字段改動拖垮3天,我們換了寫法

0
分享至


2023年Q3,我們團隊一個DTO加字段的PR,平均 review 時間從4小時漲到11小時。不是業(yè)務變復雜了,是樣板代碼的債務終于到期。

Java 開發(fā)者都懂這種痛。紙上流程干凈得像瀑布:加字段、改映射、跑測試、合并。真進代碼庫,你會發(fā)現(xiàn)那個字段像觸手怪——構造函數(shù)、建造器、序列化器、校驗注解,最后還有一個誰都不想點開的工具類。

我們的 DTO 層就這樣,從"有點啰嗦"滑向"明顯超重"。

從 Lombok 到 Records,不是追新,是還債

先說清楚:換 Records 不是為了在簡歷上寫"掌握 Java 14+ 新特性"。是某天我盯著一行 @Builder.Default 看了五分鐘,突然想不起它當初為什么存在。

Lombok 是個好拐杖。2017 年我們引入它時,Getter/Setter 的噪音確實消失了。但拐杖用久了,你會忘記腿本來該怎么走。

我們的 DTO 逐漸長成這樣:Immutable 用 @Value,可變對象用 @Data,建造器模式套 @Builder,再加上 Jackson 的注解、Hibernate Validator 的注解、自定義的 @Mapper 注解。一個 8 字段的 DTO,文件行數(shù)輕松破 80。

更隱蔽的問題是"隱形耦合"。Lombok 生成的代碼不參與編譯期檢查,IDE 里跳轉(zhuǎn)不到,重構時全靠搜索。有次我們改了一個字段名,@Builder 生成的全參構造器沒跟著變,測試全綠,生產(chǎn)環(huán)境序列化報錯——因為 Jackson 用的還是舊的字段名映射。

Records 的吸引力在這里:它是語言級特性,不是字節(jié)碼魔術。編譯器看得見,IDE 跟得上,反射也認。

遷移不是搬家,是斷舍離

我們沒搞大爆炸重構。選了一條最臟的業(yè)務線試點——訂單域的 37 個 DTO,覆蓋創(chuàng)建、查詢、導出三種場景。

第一個發(fā)現(xiàn):Records 的緊湊是真實的。public record OrderDTO(String id, BigDecimal amount, Instant createdAt) {} 這一行,等效于 Lombok 時代的 15 行:類聲明、@Value、4 個字段、4 個 Getter、全參構造器、equals/hashCode/toString。

但省行數(shù)不是重點。重點是這些行為現(xiàn)在由 JVM 保證,而不是一個注解處理器在編譯期偷偷改寫 AST。

第二個發(fā)現(xiàn):建造器模式必須放棄。Records 的字段是 final 的,且必須在構造時初始化。我們原來的 @Builder 鏈式調(diào)用寫得很爽,OrderDTO.builder().id("123").amount(new BigDecimal("99.00")).build(),現(xiàn)在得改成 new OrderDTO("123", new BigDecimal("99.00"), Instant.now())。

團隊里有人抵觸:"參數(shù)一多,構造器調(diào)用可讀性太差。"我們試了兩種妥協(xié):小 DTO 直接裸構造,大 DTO 手寫靜態(tài)工廠方法,按業(yè)務語義命名參數(shù)。比如 OrderDTO.forNewCart("123", "99.00") 比裸 new 好懂,又不依賴字節(jié)碼生成。

第三個發(fā)現(xiàn):Jackson 的兼容性比預期順滑。ObjectMapper 注冊 JavaTimeModule 后,Records 的序列化/反序列化開箱即用。唯一要改的是字段命名策略——我們原來用 @JsonProperty 覆蓋駝峰,現(xiàn)在統(tǒng)一在 ObjectMapper 配置層解決,DTO 本身保持干凈。

那些沒寫在 Release Note 里的成本

遷移完 37 個 DTO,我們算了筆賬。

正面:DTO 文件平均行數(shù)從 67 降到 12。代碼審查時, reviewer 能一眼看完數(shù)據(jù)結構和校驗規(guī)則,不用再展開 Lombok 生成的折疊代碼。

負面:MapStruct 的映射代碼要重寫。原來 Lombok 的 @Builder 支持 targetBuilder 模式,Records 沒有建造器,只能改用 @Mapping 注解直接指定構造參數(shù)。17 個映射接口,每個多花了 20 分鐘調(diào)整。

還有一個長期成本:團隊培訓。 junior 開發(fā)問得最多的是"Records 能繼承嗎"(不能)、"能加 Setter 嗎"(不能)、"那業(yè)務需求要改字段怎么辦"(新建實例)。這些問題 Lombok 時代不存在,因為 @Data 什么都能干,也什么都敢干。

我們的選擇是:把 Records 的約束當成設計審查。如果某個 DTO 真的需要可變字段,說明它可能不是純數(shù)據(jù)載體,該拆成狀態(tài)機或者移到領域?qū)印?/p>

試點三個月后,訂單域的生產(chǎn) bug 率沒明顯變化,但 DTO 相關的代碼審查評論數(shù)從平均每 PR 8.3 條降到 2.1 條。大部分爭議從"這個字段該不該加 @NonNull"變成了"這個字段該不該存在"。

現(xiàn)在回頭看 Lombok

我們沒卸載 Lombok。日志用的 @Slf4j、異常類的 @StandardException 還在服役。只是 DTO 這個場景,Records 的"少即是多"更貼合我們現(xiàn)在的需求。

有個細節(jié)挺有意思:JDK 21 的 Record Patterns 和 Switch 模式匹配,讓我們的 DTO 消費代碼又短了一截。原來 if (dto instanceof OrderDTO) 配強制轉(zhuǎn)型,現(xiàn)在直接 case OrderDTO(String id, var amount, _) -> ...,解構和判斷一步完成。

這是語言特性疊代的復利。2017 年我們選 Lombok,是因為 Java 8 的語法表達能力不夠。2024 年語言本身追上來了,拐杖就該放回儲藏室。

你們團隊的 DTO 現(xiàn)在是什么狀態(tài)?是 Records 全量替換,還是 Lombok 繼續(xù)扛主力,或者兩者混用、邊界模糊?

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關推薦
熱點推薦
許家印當庭四字表態(tài)!夏海鈞1.6億、任澤平731萬,一分別想留

許家印當庭四字表態(tài)!夏海鈞1.6億、任澤平731萬,一分別想留

墜入二次元的海洋
2026-04-15 08:47:21
長沙正在流行“新型出軌”:不開房、不暖昧,卻比肉體背叛更誅心

長沙正在流行“新型出軌”:不開房、不暖昧,卻比肉體背叛更誅心

風起見你
2026-04-16 02:29:16
金立創(chuàng)始人劉立榮消失8年后最新動向:被曝在印尼賣家具,海爾、寧德時代、小米都是客戶

金立創(chuàng)始人劉立榮消失8年后最新動向:被曝在印尼賣家具,海爾、寧德時代、小米都是客戶

金融界
2026-04-15 09:45:24
官宣!又是老二,杜蘭特!

官宣!又是老二,杜蘭特!

左右為籃
2026-04-15 13:01:00
舒梅切爾和諾伊爾開玩笑:你想讓比賽再變得刺激一點,對吧?

舒梅切爾和諾伊爾開玩笑:你想讓比賽再變得刺激一點,對吧?

懂球帝
2026-04-16 07:56:15
“中方要求兩大航運公司立即停止巴拿馬港口運營”

“中方要求兩大航運公司立即停止巴拿馬港口運營”

觀察者網(wǎng)
2026-04-15 16:28:22
胖東來回應多寶魚被指吃出標簽:二維碼專利溯源標簽可隨食材一同烹制,但本身不可食用

胖東來回應多寶魚被指吃出標簽:二維碼專利溯源標簽可隨食材一同烹制,但本身不可食用

財經(jīng)網(wǎng)
2026-04-14 21:32:10
一瓶“宋柚汁”柚汁占比僅有2.7%、宋柚只是商標?創(chuàng)始人出鏡澄清:這是香柚的黃金配比!

一瓶“宋柚汁”柚汁占比僅有2.7%、宋柚只是商標?創(chuàng)始人出鏡澄清:這是香柚的黃金配比!

北青網(wǎng)-北京青年報
2026-04-15 11:28:05
我的天哪,劉亦菲還穿過這么暴露的衣服啊

我的天哪,劉亦菲還穿過這么暴露的衣服啊

阿廢冷眼觀察所
2026-04-16 01:13:12
美國真正的幕后老板現(xiàn)身了,特朗普瑟瑟發(fā)抖

美國真正的幕后老板現(xiàn)身了,特朗普瑟瑟發(fā)抖

一個壞土豆
2026-04-15 19:35:37
尼古拉斯·凱奇《戰(zhàn)爭之王2》首張劇照曝光 2027年上映!

尼古拉斯·凱奇《戰(zhàn)爭之王2》首張劇照曝光 2027年上映!

3DM游戲
2026-04-13 09:58:06
武大楊某媛,去當女裝銷售了

武大楊某媛,去當女裝銷售了

大張的自留地
2026-04-14 13:21:50
跟隊:若阿韋洛亞下課,皇馬可能考慮克洛普、德尚、波切蒂諾

跟隊:若阿韋洛亞下課,皇馬可能考慮克洛普、德尚、波切蒂諾

懂球帝
2026-04-16 07:14:07
瀏覽器原地變龍蝦!Chrome上線Skills,技能一鍵復用幫你干活

瀏覽器原地變龍蝦!Chrome上線Skills,技能一鍵復用幫你干活

量子位
2026-04-15 13:44:27
沉默2天后,中方通告全球,藏南是中國領土,并送給印度一個忠告

沉默2天后,中方通告全球,藏南是中國領土,并送給印度一個忠告

軍機Talk
2026-04-15 11:29:39
穆里尼奧成為英超俱樂部候選主帥

穆里尼奧成為英超俱樂部候選主帥

綠茵情報局
2026-04-16 05:19:56
上海地鐵人肉占三座大媽正臉被曝,被乘客指責后還狡辯她先來的

上海地鐵人肉占三座大媽正臉被曝,被乘客指責后還狡辯她先來的

小影的娛樂
2026-04-15 13:07:50
涼山18歲女孩全家“社會性死亡”!裝貧連騙3位網(wǎng)紅,現(xiàn)更富裕了

涼山18歲女孩全家“社會性死亡”!裝貧連騙3位網(wǎng)紅,現(xiàn)更富裕了

千言娛樂記
2026-04-15 15:43:57
伊朗航母殘骸曝光:已經(jīng)處于半沉狀態(tài)

伊朗航母殘骸曝光:已經(jīng)處于半沉狀態(tài)

烽火觀天下
2026-04-13 12:52:31
英軍上將警告:若臺海開戰(zhàn),英軍將同時打擊中俄,重點對付中!

英軍上將警告:若臺海開戰(zhàn),英軍將同時打擊中俄,重點對付中!

別吵吵
2026-04-15 09:49:16
2026-04-16 08:28:49
灰度測試中
灰度測試中
生活正在重構,目前還在灰度測試階段,暫不全量發(fā)布。
1401文章數(shù) 15關注度
往期回顧 全部

科技要聞

小鵬最貴SUV預售39.98萬!L4架構3000TOPS算力

頭條要聞

歐洲100萬人請愿要求制裁以色列 以總理:歐洲道德軟弱

頭條要聞

歐洲100萬人請愿要求制裁以色列 以總理:歐洲道德軟弱

體育要聞

三球準絕殺戴大金鏈:轟30+10自我救贖

娛樂要聞

謝娜現(xiàn)身環(huán)球影城,牽手女兒溫馨有愛

財經(jīng)要聞

業(yè)績失速的Lululemon:"健康"人設崩塌?

汽車要聞

空間絲毫不用妥協(xié) 小鵬GX首發(fā)評測

態(tài)度原創(chuàng)

本地
手機
游戲
房產(chǎn)
公開課

本地新聞

12噸巧克力有難,全網(wǎng)化身超級偵探添亂

手機要聞

驍龍8 Elite Gen6曝光!臺積電2nm+2+3+3架構,小米18系列穩(wěn)了

天才!修車模擬器撞檔《地平線6》:賽完車去修車

房產(chǎn)要聞

重磅調(diào)規(guī)!341畝商改住+中小學用地!寶龍城這把穩(wěn)了?

公開課

李玫瑾:為什么性格比能力更重要?

無障礙瀏覽 進入關懷版