關(guān)于@Data和@Builder注解解析
@Data和@Builder注解解析
@Data 和 @Builder是使用 lombok過程中常用的兩個(gè)注解
- @Data:將一個(gè)普通類變成JavaBean,并自動生成相應(yīng)屬性的 Getter,Setter等方法
- @Builder:用構(gòu)造者模式,通過鏈?zhǔn)椒椒◣椭覀兩蓪ο?/li>
存在問題
@Data 和 @Builder這兩個(gè)注解混合使用,會編譯失敗。
解決方案一
通過添加@NoArgsConstructor 和 @AllArgsConstructor 這兩個(gè)注解。
這種方式會通過@AllArgsConstructor生成一個(gè)訪問級別為 public 的全參構(gòu)造器。
@Builder可以用生成的全參構(gòu)造器來構(gòu)造對象,不再與@Data所包含的@RequiredArgsConstructor發(fā)生沖突。
解決方案二
通過自己重寫無參構(gòu)造器,并添加@Tolerate注解。
重寫的無參構(gòu)造器可以幫助我們解決@Data與 @Builder 注解的沖突。
原因分析
@Data為一個(gè) Java類賦予了 JavaBean 的全部功能.實(shí)現(xiàn)了Getter,Setter,構(gòu)造器,toString等。
在為一個(gè) JavaBean 在增加 @Data注解后,可以使用set方法設(shè)置對象屬性并且使用get方法讀取屬性。
@Builder 構(gòu)造者模式的初衷是構(gòu)建并產(chǎn)出復(fù)雜產(chǎn)品,在配置好屬性后產(chǎn)出的結(jié)果是一個(gè)產(chǎn)品,此時(shí)對于開發(fā)者而言更加注重的是使用產(chǎn)品的功能而非獲取產(chǎn)品內(nèi)部的構(gòu)造,與 JavaBean的區(qū)別在于在獲取產(chǎn)品后是無法再對產(chǎn)品設(shè)置屬性,讀取屬性。
而 @Builder 會為類創(chuàng)建一個(gè)構(gòu)造內(nèi)部類,通過該類可以構(gòu)造產(chǎn)品。
該種情形下,開發(fā)者不應(yīng)該通過 new創(chuàng)建對象而是統(tǒng)一通過構(gòu)造類創(chuàng)建對象,@Builder 獲取到的對象也沒有set和get功能。
@Builder與@Data一起使用的效果
首先@Data注解標(biāo)記了我們最終的產(chǎn)出注定是一個(gè)JavaBean,而JavaBean 中的屬性是可以設(shè)置的,構(gòu)造器模式的使用可以幫助我們通過鏈?zhǔn)秸{(diào)用的方式快速構(gòu)建 JavaBean,以往我們需要通過多行set方法實(shí)現(xiàn)的 JavaBean在構(gòu)造器模式下只需要一行即可完成.
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解釋為什么Java中“1000==1000”為false而”100==100“為true
在日常編程中,我們經(jīng)常遇到一些看似簡單卻隱藏著復(fù)雜邏輯的問題,這篇文章主要介紹了解釋為什么Java中“1000==1000”為false而”100==100“為true,需要的朋友可以參考下2024-01-01Linux部署springboot項(xiàng)目彩色日志打印方式
這篇文章主要介紹了Linux部署springboot項(xiàng)目彩色日志打印方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04剖析Java中阻塞隊(duì)列的實(shí)現(xiàn)原理及應(yīng)用場景
這篇文章主要介紹了剖析Java中阻塞隊(duì)列的實(shí)現(xiàn)原理及應(yīng)用場景,這里也對阻塞和非阻塞隊(duì)列的不同之處進(jìn)行了對比,需要的朋友可以參考下2015-12-12Spring實(shí)戰(zhàn)之使用TransactionProxyFactoryBean實(shí)現(xiàn)聲明式事務(wù)操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用TransactionProxyFactoryBean實(shí)現(xiàn)聲明式事務(wù)操作,結(jié)合實(shí)例形式分析了spring使用TransactionProxyFactoryBean實(shí)現(xiàn)聲明式事務(wù)相關(guān)配置、接口設(shè)置與使用技巧,需要的朋友可以參考下2020-01-01Java8實(shí)現(xiàn)優(yōu)雅的獲取重復(fù)字符與次數(shù)
這篇文章主要為大家詳細(xì)介紹了在Java8中,我們應(yīng)該如何進(jìn)行字符及字符串的去重,以及計(jì)算去重次數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2023-12-12