關(guān)于@Data和@Builder注解解析
@Data和@Builder注解解析
@Data 和 @Builder是使用 lombok過(guò)程中常用的兩個(gè)注解
- @Data:將一個(gè)普通類(lèi)變成JavaBean,并自動(dòng)生成相應(yīng)屬性的 Getter,Setter等方法
- @Builder:用構(gòu)造者模式,通過(guò)鏈?zhǔn)椒椒◣椭覀兩蓪?duì)象
存在問(wèn)題
@Data 和 @Builder這兩個(gè)注解混合使用,會(huì)編譯失敗。
解決方案一
通過(guò)添加@NoArgsConstructor 和 @AllArgsConstructor 這兩個(gè)注解。
這種方式會(huì)通過(guò)@AllArgsConstructor生成一個(gè)訪(fǎng)問(wèn)級(jí)別為 public 的全參構(gòu)造器。
@Builder可以用生成的全參構(gòu)造器來(lái)構(gòu)造對(duì)象,不再與@Data所包含的@RequiredArgsConstructor發(fā)生沖突。

解決方案二
通過(guò)自己重寫(xiě)無(wú)參構(gòu)造器,并添加@Tolerate注解。
重寫(xiě)的無(wú)參構(gòu)造器可以幫助我們解決@Data與 @Builder 注解的沖突。

原因分析
@Data為一個(gè) Java類(lèi)賦予了 JavaBean 的全部功能.實(shí)現(xiàn)了Getter,Setter,構(gòu)造器,toString等。
在為一個(gè) JavaBean 在增加 @Data注解后,可以使用set方法設(shè)置對(duì)象屬性并且使用get方法讀取屬性。
@Builder 構(gòu)造者模式的初衷是構(gòu)建并產(chǎn)出復(fù)雜產(chǎn)品,在配置好屬性后產(chǎn)出的結(jié)果是一個(gè)產(chǎn)品,此時(shí)對(duì)于開(kāi)發(fā)者而言更加注重的是使用產(chǎn)品的功能而非獲取產(chǎn)品內(nèi)部的構(gòu)造,與 JavaBean的區(qū)別在于在獲取產(chǎn)品后是無(wú)法再對(duì)產(chǎn)品設(shè)置屬性,讀取屬性。
而 @Builder 會(huì)為類(lèi)創(chuàng)建一個(gè)構(gòu)造內(nèi)部類(lèi),通過(guò)該類(lèi)可以構(gòu)造產(chǎn)品。
該種情形下,開(kāi)發(fā)者不應(yīng)該通過(guò) new創(chuàng)建對(duì)象而是統(tǒng)一通過(guò)構(gòu)造類(lèi)創(chuàng)建對(duì)象,@Builder 獲取到的對(duì)象也沒(méi)有set和get功能。

@Builder與@Data一起使用的效果
首先@Data注解標(biāo)記了我們最終的產(chǎn)出注定是一個(gè)JavaBean,而JavaBean 中的屬性是可以設(shè)置的,構(gòu)造器模式的使用可以幫助我們通過(guò)鏈?zhǔn)秸{(diào)用的方式快速構(gòu)建 JavaBean,以往我們需要通過(guò)多行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)常遇到一些看似簡(jiǎn)單卻隱藏著復(fù)雜邏輯的問(wèn)題,這篇文章主要介紹了解釋為什么Java中“1000==1000”為false而”100==100“為true,需要的朋友可以參考下2024-01-01
Linux部署springboot項(xiàng)目彩色日志打印方式
這篇文章主要介紹了Linux部署springboot項(xiàng)目彩色日志打印方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
剖析Java中阻塞隊(duì)列的實(shí)現(xiàn)原理及應(yīng)用場(chǎng)景
這篇文章主要介紹了剖析Java中阻塞隊(duì)列的實(shí)現(xiàn)原理及應(yīng)用場(chǎng)景,這里也對(duì)阻塞和非阻塞隊(duì)列的不同之處進(jìn)行了對(duì)比,需要的朋友可以參考下2015-12-12
java開(kāi)發(fā)使用BigDecimal避坑四則
這篇文章主要為大家介紹了java開(kāi)發(fā)使用BigDecimal的避坑四則,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Spring實(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-01
JAVA匿名內(nèi)部類(lèi)語(yǔ)法分析及實(shí)例詳解
這篇文章主要介紹了JAVA匿名內(nèi)部類(lèi)語(yǔ)法分析及實(shí)例詳解,匿名內(nèi)部類(lèi)可以使你的代碼更加簡(jiǎn)潔,它與局部類(lèi)很相似,不同的是它沒(méi)有類(lèi)名,如果某個(gè)局部類(lèi)你只需要用一次,那么你就可以使用匿名內(nèi)部類(lèi)。對(duì)此感興趣的可以了解一下2020-07-07
Java8實(shí)現(xiàn)優(yōu)雅的獲取重復(fù)字符與次數(shù)
這篇文章主要為大家詳細(xì)介紹了在Java8中,我們應(yīng)該如何進(jìn)行字符及字符串的去重,以及計(jì)算去重次數(shù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2023-12-12

