Java基礎(chǔ)系列-Lombok常用注解


原創(chuàng)文章,轉(zhuǎn)載請標(biāo)注出處:《Java基礎(chǔ)系列-Lombok常用注解》


Lombok注解解析:

@NonNull

使用在方法的參數(shù)或者構(gòu)造器的參數(shù)上房午,用于生成null驗證蹋绽。

Lombok可以識別任何第三方工具的字段上標(biāo)注的@NonNull名稱的注解拍霜,并在使用@Data昧互、@AllArgsContruct進(jìn)行生成方法和構(gòu)造器時進(jìn)行null判斷挽铁。

而Lombok的@NonNull注解使用在參數(shù)之上,僅僅作用到你自定義的方法和構(gòu)造器之上敞掘。

null判斷會采用:

if (param == null) 
        throw new NullPointerException("param is marked @NonNull but is null");

的形式插入叽掘,并且會在你方法的開頭和構(gòu)造器的this,super之類的調(diào)用之后插入。

@Cleanup

使用在資源之前玖雁,用于表示資源可以被完美自動釋放(在代碼的執(zhí)行路徑超出資源范圍之前)更扁。

將該注解標(biāo)注在表示資源的變量之上,比如:@Cleanup InputStream in = new FileInputStream("some/file");

這樣一來赫冬,在資源范圍結(jié)束的位置會自動調(diào)用in.close()方法進(jìn)行資源釋放浓镜。這個調(diào)用會在try...finally...塊中調(diào)用,來保證調(diào)用必定會執(zhí)行劲厌。

當(dāng)然竖哩,你也可以在注解內(nèi)部定義釋放資源的方法名稱,來指定釋放資源的具體方法脊僚,這適用于沒有close()方法的情況下,必須保證這些方法是無參的。

@Getter and @Setter

標(biāo)注在字段之上辽幌,用于自動生成get增淹、set方法。Boolean類型為is開頭乌企。

生成的get虑润、set方法默認(rèn)情況之下都是public的,但也可以手動指定范圍value=AccessLevel.PUBLIC加酵、AccessLevel.PROTECTED拳喻、AccessLevel.PRIVATE、AccessLevel.PRIVATE四種猪腕。

也能標(biāo)注在類上冗澈,表示針對該類中所有的非靜態(tài)字段進(jìn)行g(shù)et、set方法自動生成陋葡。

如果指定某個字段的AccessLevel=AccessLevel.NONE亚亲,則可以使該生成動作失效,此時可以手動實現(xiàn)get腐缤、set方法捌归,這應(yīng)用于在這些方法中有一些自定義邏輯的情況下。

@ToString

標(biāo)注于類之上岭粤,用于生成toString()方法惜索。

includeFieldNames,默認(rèn)為true剃浇,表示在toString輸出時輸出字段名稱巾兆。

callSuper,默認(rèn)為false偿渡,表示生成toString時不輸出超類中的字段內(nèi)容臼寄,若要輸出超類中的內(nèi)容,需要設(shè)置為true

doNotUseGetters溜宽,默認(rèn)為false吉拳,表示獲取字段值時通過get方法獲取,設(shè)置為true表示直接通過字段獲取

onlyExplicitlyIncluded适揉,默認(rèn)為false留攒,表示輸出所有非靜態(tài)字段內(nèi)容,如果設(shè)置為true嫉嘀,則只輸出標(biāo)注有@ToString.Include的字段和方法

@ToString.Include

標(biāo)注于字段炼邀、方法之上,表示生成toString方法時包含該注解標(biāo)注的字段和方法剪侮,需要與onlyExplicitlyIncluded一起使用拭宁。

rank洛退,默認(rèn)為0,表示級別杰标,數(shù)字越大級別越高兵怯,高級別將會優(yōu)先輸出,同級別按照代碼順序輸出腔剂。

name媒区,可以為標(biāo)注的成員(字段或者方法)另起一個名字。

@ToString.Exclude

標(biāo)注于字段之上掸犬,表示生成toString方法時不包含被該注解標(biāo)注的字段袜漩。那么生成toString方法時會跳過這些字段,

@EqualsAndHashCode

標(biāo)注于類之上用于生成hashCode方法和equals方法湾碎。

callSuper宙攻,同上

doNotUseGetters,同上

onlyExplicitlyIncluded胜茧,同上粘优,需要配合@EqualsAndHashCode.Include使用。

@EqualsAndHashCode.Include

標(biāo)注于字段或者方法之上呻顽,需要與onlyExplicitlyIncluded配合使用雹顺,表示將該注解標(biāo)注的內(nèi)容添加到實現(xiàn)hashCode和equals方法的內(nèi)容中去。

@EqualsAndHashCode.Exclude

標(biāo)注于字段之上廊遍,用于排除不需要參與生成hashCode和equals方法的字段嬉愧。可單獨使用喉前。

@NoArgsConstructor

用于生成無參構(gòu)造器没酣,如果類中存在final字段,則會報編譯錯誤卵迂。一般結(jié)合其他幾個構(gòu)造器注解一起使用提供一個無參構(gòu)造器裕便,并且不會檢查@NonNull標(biāo)注的字段

force,默認(rèn)為false,表示是否針對final字段進(jìn)行特殊處理见咒,如果將其設(shè)置為true偿衰,則上面的編譯錯誤將會消失,內(nèi)部處理為改览,將final字段初始化為0\false\null

access下翎,默認(rèn)為lombok.AccessLevel.PUBLIC,表示public范圍的構(gòu)造器

staticName宝当,一旦設(shè)置該值视事,則會生成一個靜態(tài)的“構(gòu)造器”工廠,其內(nèi)部包裹著一個私有的構(gòu)造器庆揩,對外提供創(chuàng)建對象的功能俐东,這是明顯的工廠模式跌穗。

@RequiredArgsConstructor

用于按照要求生成構(gòu)造器,所謂的要求就是包含final字段和類似于@NonNull約束標(biāo)注的字段虏辫,會對@NonNull字段進(jìn)行明確的null檢查

access瞻离,同上

staticName,同上

@AllArgsConstructor

用于生成包含所有字段的構(gòu)造器乒裆。@NonNull字段會進(jìn)行null判斷檢查。

access推励,同上

staticName鹤耍,同上

@Data

標(biāo)注于類之上,是@ToString验辞,@EqualsAndHashCode稿黄、@Getter、@Setter跌造、@RequiredArgsConstructor的綜合體
  staticConstructor杆怕,同staticName

@Value

可以看成是@Data的變體,表示生成一個不可變類(final類)壳贪。沒有set方法陵珍,只有g(shù)et方法,字段全部為final private的违施,類也是final的

等效于@Getter @FieldDefaults(makeFinal=true, level=AccessLevel.PRIVATE) @AllArgsConstructor @ToString @EqualsAndHashCode

staticConstructor互纯,同上。

如果手工實現(xiàn)了任何一個注解的功能磕蒲,那么該注解將失效留潦,為了使注解起效,你可以在手共實現(xiàn)的方法上添加注解@lombok.experimental.Tolerate辣往,用于將手共實現(xiàn)對lombok隱藏兔院。

我們可以使用下面兩種方式來重寫默認(rèn)為final和private的行為,一是直接在字段上添加accessLevel站削,二是使用@NonFinal或者@PackagePrivate注解坊萝。

@Builder

標(biāo)注于類之上,用于生成復(fù)雜的builder API钻哩,創(chuàng)建構(gòu)建者模式屹堰。

還可用于標(biāo)注于構(gòu)造器和方法之上。

@SneakyThrows

標(biāo)注于方法之上用于隱藏異常拋出語句街氢,該注解存在爭議扯键,暫不使用

@Log

  • @CommonsLog
  • @Flogger
  • @JBossLog
  • @Log
  • @Log4j
  • @Log4j2
  • @Slf4j
  • @XSlf4j

@Synchronized

標(biāo)注于方法(只能用于靜態(tài)方法和實例方法)之上,用于表示同步方法珊肃,鎖可以使用默認(rèn)的也可以使用自定義的鎖(private final )荣刑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馅笙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厉亏,更是在濱河造成了極大的恐慌董习,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爱只,死亡現(xiàn)場離奇詭異皿淋,居然都是意外死亡,警方通過查閱死者的電腦和手機恬试,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門窝趣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人训柴,你說我怎么就攤上這事哑舒。” “怎么了幻馁?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵洗鸵,是天一觀的道長。 經(jīng)常有香客問我仗嗦,道長膘滨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任儒将,我火速辦了婚禮吏祸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钩蚊。我一直安慰自己贡翘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布砰逻。 她就那樣靜靜地躺著鸣驱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝠咆。 梳的紋絲不亂的頭發(fā)上踊东,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音刚操,去河邊找鬼闸翅。 笑死,一個胖子當(dāng)著我的面吹牛菊霜,可吹牛的內(nèi)容都是我干的坚冀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鉴逞,長吁一口氣:“原來是場噩夢啊……” “哼记某!你這毒婦竟也來了司训?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤液南,失蹤者是張志新(化名)和其女友劉穎壳猜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滑凉,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡统扳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了畅姊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闪幽。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涡匀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情溉知,我是刑警寧澤陨瘩,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站级乍,受9級特大地震影響舌劳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玫荣,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一甚淡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捅厂,春花似錦贯卦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辙芍,卻和暖如春啡彬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背故硅。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工庶灿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吃衅。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓往踢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捐晶。 傳聞我的和親對象是個殘疾皇子菲语,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354