一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 為什么有的團(tuán)隊(duì)嚴(yán)禁使用Lombok?

為什么有的團(tuán)隊(duì)嚴(yán)禁使用Lombok?

2021-09-29 23:26Java極客技術(shù)鴨血粉絲Tang Java教程

Java,作為一款非常熱門的編程語(yǔ)言,盡管它有著非常豐富的語(yǔ)言特性,完全面向?qū)ο缶幊蹋幊谈叨纫?guī)范化。

為什么有的團(tuán)隊(duì)嚴(yán)禁使用Lombok?

一、介紹

Java,作為一款非常熱門的編程語(yǔ)言,盡管它有著非常豐富的語(yǔ)言特性,完全面向?qū)ο缶幊蹋幊谈叨纫?guī)范化,但是也有一個(gè)最受大家詬病的一個(gè)缺點(diǎn):?jiǎn)拢绕涫钱?dāng)你開發(fā)了很多年之后,你會(huì)明顯的感受到,相比動(dòng)態(tài)語(yǔ)言,java 定義變量之前,要先創(chuàng)建類,然后定義變量類型,每個(gè)類要寫很多的get/set/toString/hashCode/equals等等方法。

尤其是當(dāng)一個(gè)實(shí)體類,高達(dá)幾十個(gè)變量時(shí),寫完get、set方法之后,一個(gè)實(shí)體類的長(zhǎng)度快接近一千行。

為什么有的團(tuán)隊(duì)嚴(yán)禁使用Lombok?

為了避免寫這些“羅嗦”的方法,很多程序員一直在尋覓著找一個(gè)能夠使他們擺脫這種重復(fù)勞動(dòng)工作的工具,例如:idea、eclipse 開發(fā)工具的快捷生成get、set方法的工具,還有我們今天要談?wù)摰倪@個(gè)Lombok工具。

二、Lombok

Lombok 是一款非常流行的代碼簡(jiǎn)潔工具,利用它的注解特性,直接就可以幫我們省去高大幾百行的get、set方法,操作非常方便。

如果是idea開發(fā)工具,可以直接在preferences -> plugins里面搜索lombok,然后點(diǎn)擊安裝即可!

為什么有的團(tuán)隊(duì)嚴(yán)禁使用Lombok?

接著,在項(xiàng)目工程中導(dǎo)入lombok依賴包!

  1. org.projectlombok
  2. lombok
  3. 1.18.12
  4. provided

最后,只需要在對(duì)應(yīng)的實(shí)體類上加上@Data注解,即可完成類屬性get/set的注入。

  1. importlombok.Data;
  2. @Data
  3. publicclassUser{
  4. privateStringid;
  5. privateStringage;
  6. privateStringname;
  7. //可以不用顯式寫get、set方法
  8. }

使用@Data注解在類上,這個(gè)實(shí)體類中的屬性就不需要顯式寫get、set方法了。

對(duì)這個(gè)類進(jìn)行編譯之后,我們打開User.class文件,看看編譯后的文件內(nèi)容長(zhǎng)啥樣?

  1. publicclassUser{
  2. privateStringid;
  3. privateStringage;
  4. privateStringname;
  5. publicUser(){
  6. }
  7. publicStringgetId(){
  8. returnthis.id;
  9. }
  10. publicStringgetAge(){
  11. returnthis.age;
  12. }
  13. publicStringgetName(){
  14. returnthis.name;
  15. }
  16. publicvoidsetId(Stringid){
  17. this.id=id;
  18. }
  19. publicvoidsetAge(Stringage){
  20. this.age=age;
  21. }
  22. publicvoidsetName(Stringname){
  23. this.name=name;
  24. }
  25. publicbooleanequals(Objecto){
  26. if(o==this){
  27. returntrue;
  28. }elseif(!(oinstanceofUser)){
  29. returnfalse;
  30. }else{
  31. Userother=(User)o;
  32. if(!other.canEqual(this)){
  33. returnfalse;
  34. }else{
  35. label47:{
  36. Objectthis$id=this.getId();
  37. Objectother$id=other.getId();
  38. if(this$id==null){
  39. if(other$id==null){
  40. breaklabel47;
  41. }
  42. }elseif(this$id.equals(other$id)){
  43. breaklabel47;
  44. }
  45. returnfalse;
  46. }
  47. Objectthis$age=this.getAge();
  48. Objectother$age=other.getAge();
  49. if(this$age==null){
  50. if(other$age!=null){
  51. returnfalse;
  52. }
  53. }elseif(!this$age.equals(other$age)){
  54. returnfalse;
  55. }
  56. Objectthis$name=this.getName();
  57. Objectother$name=other.getName();
  58. if(this$name==null){
  59. if(other$name!=null){
  60. returnfalse;
  61. }
  62. }elseif(!this$name.equals(other$name)){
  63. returnfalse;
  64. }
  65. returntrue;
  66. }
  67. }
  68. }
  69. protectedbooleancanEqual(Objectother){
  70. returnotherinstanceofUser;
  71. }
  72. publicinthashCode(){
  73. intPRIME=true;
  74. intresult=1;
  75. Object$id=this.getId();
  76. intresult=result*59+($id==null?43:$id.hashCode());
  77. Object$age=this.getAge();
  78. result=result*59+($age==null?43:$age.hashCode());
  79. Object$name=this.getName();
  80. result=result*59+($name==null?43:$name.hashCode());
  81. returnresult;
  82. }
  83. publicStringtoString(){
  84. return"User(id="+this.getId()+",age="+this.getAge()+",name="+this.getName()+")";
  85. }
  86. }

很清晰的看到,使用@Data注解之后,User類新增了get、set、hashCode、equals和toString方法。

通過上面的例子,大家可以發(fā)現(xiàn),使用@Data注解可以大大減少了代碼量,使代碼非常簡(jiǎn)潔,這也是很多開發(fā)者熱衷于使用Lombok的主要原因。

Lombok的工作原理是怎么實(shí)現(xiàn)的呢?

由于Java的官方版本沒有提供這種快速生成方法的注解工具,類似Lombok這樣的工具,其實(shí)都是使用了從Java 6和JSR 269的Annotation Processing技術(shù)中實(shí)現(xiàn)方法的注入。

簡(jiǎn)單的說(shuō),就是使用了 Java 非公開的 API,在 javac 編譯代碼時(shí),通過強(qiáng)類型轉(zhuǎn)換獲取JavacAnnotationProcessor對(duì)象,再?gòu)腏avacAnnotationProcessor的方法里面拿到抽象語(yǔ)法樹(AST)做強(qiáng)制修改,注入get、set等方法。

使用Lombok這種方案,有個(gè)最大的好處,就是可以節(jié)省大量的重復(fù)代碼,讓代碼更佳簡(jiǎn)潔!但是也有很多弊端!

三、有哪些壞處呢?

3.1、強(qiáng)迫隊(duì)友也安裝 Lombok

當(dāng)你在使用Lombok工具插件來(lái)快速開發(fā)項(xiàng)目的時(shí)候,如果別的同事也要和你一起協(xié)作開發(fā)項(xiàng)目,那么他不得不也要安裝Lombok插件,不然項(xiàng)目編譯會(huì)報(bào)錯(cuò)。

3.2、代碼可調(diào)試性降低

代碼可調(diào)試性會(huì)降低,為什么會(huì)這么說(shuō)呢?

Lombok雖然給我們節(jié)省了get和set方法的編程,但是如果我想知道類的某個(gè)屬性被哪些方法操作給set了,如果用原生的方法,可以很好的知道調(diào)用方。但是如果使用Lombok插件來(lái)生成,這個(gè)時(shí)候你根本無(wú)從得知。甚至沒辦法調(diào)試!

3.3、不懂 Lombok 注解,會(huì)踩坑

我們知道,使用@Data會(huì)重寫hashCode()和equals()方法,如果是單個(gè)實(shí)體類,沒有繼承的話,你使用@Data不會(huì)產(chǎn)生問題。

但是如果這個(gè)實(shí)體類又繼承了父類,@Data只會(huì)重寫子類的hashCode()和equals()方法,不會(huì)把父類的屬性加進(jìn)去,這樣就會(huì)導(dǎo)致,例如當(dāng)你在使用HashMap的時(shí)候,用當(dāng)前這個(gè)實(shí)體類作為key,可能會(huì)得到意想不到的結(jié)果。

遇到這種情況,你可以在類上加上這個(gè)注解@EqualsAndHashCode(callSuper=true),子類的hashCode()和equals()方法會(huì)加入父類的屬性。

3.4、破壞封裝性

封裝是 java 面向?qū)ο缶幊讨蟹浅V匾囊粋€(gè)特性。

例如,針對(duì)User實(shí)體類,我新加一個(gè)tag屬性,我只想暴露它的get方法,不想暴露set方法給外部,沒有用@Data注解的時(shí)候,我可以很靈活的進(jìn)行編程,但是使用@Data注解之后,屬性tag被完全暴露在外界了。

  1. publicclassUser{
  2. privateStringid;
  3. privateStringage;
  4. privateStringname;
  5. privateStringtag="學(xué)生";
  6. publicStringgetTag(){
  7. returntag;
  8. }
  9. }

3.5、影響 jdk 升級(jí)

其實(shí)以上的坑點(diǎn),都不算什么很大的坑點(diǎn),在我看來(lái),最大的坑點(diǎn)其實(shí)就是Lombok的工作原理,使用了非官方支持的 API 接口,通過程序強(qiáng)制植入方式來(lái)修改類,實(shí)現(xiàn)get、set等方法的注入。

按照如今 JDK 的升級(jí)頻率,每半年都會(huì)推出一個(gè)新的版本,但是Lombok作為一個(gè)第三方工具,并且是由開源團(tuán)隊(duì)維護(hù)的,那么他的迭代速度是無(wú)法保證的。

假如某天JDK把這種后門堵住了,那Lombok基本上就不能用了,到時(shí)候又是個(gè)麻煩事情。

四、總結(jié)

Lombok 作為一款非常流行的工具插件,肯定有它自身的優(yōu)勢(shì)所在,到底建不建議在日常開發(fā)中使用,我個(gè)人其實(shí)是一個(gè)中立的態(tài)度,如果你們團(tuán)隊(duì)的人都喜歡它,那推薦你使用,在使用之前,最好培訓(xùn)一下,有哪些坑點(diǎn),避免踩坑。

如果多數(shù)人不太喜歡用它,那就不推薦你使用,很多公司禁止你使用它的原因,其實(shí)這種插件有點(diǎn)類似那種流氓插件,工作原理不是官方所認(rèn)可的方式來(lái)實(shí)現(xiàn),假如某天新版本的 jdk 突然把這個(gè)漏洞給堵住了,那么項(xiàng)目想要升級(jí) jdk,就比較困難。

因此大家在評(píng)估要不要在代碼中引入Lombok的時(shí)候,在想它的優(yōu)點(diǎn)同時(shí),能夠考慮到它會(huì)帶來(lái)的哪些問題,以便更好的做決定!

五、參考

https://projectlombok.org/

https://time.geekbang.org/column/article/164907

http://blog.itpub.net/69908877/viewspace-2676272/

原文鏈接:https://mp.weixin.qq.com/s/5EE0Vf8A2-8fnMQGfw0U-w

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7472021-02-04
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒有升過級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來(lái)介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 99精品免费在线 | 国产毛片一级aaaaa片 | 日本三级做a全过程在线观看 | 亚洲精品高清中文字幕完整版 | 国产精品一区牛牛影视 | 搞逼综合网 | 逼中极品| 506rr亚洲欧美 | 日韩欧美高清一区 | 第一福利在线导航 | 久久国内精品 | 2021国产麻豆剧传媒新片 | 暖暖日本在线观看免费 | 精品国产福利一区二区在线 | 男人的天堂久久 | 亚洲国产精品日韩高清秒播 | 成人免费观看网欧美片 | 青青青国产成人久久111网站 | 亚洲精品国产福利片 | 武侠古典久久亚洲精品 | 国产永久免费爽视频在线 | 精品国产无限资源免费观看 | 国产亚洲精品精品国产亚洲综合 | 暖暖视频日本 | 欧美日韩国产精品综合 | 娇妻中日久久持久久 | xxxxxx国产精品视频 | 国产午夜精品一区二区三区 | 精品精品国产自在久久高清 | 为什么丈夫插我我却喜欢被打着插 | 成人午夜视频一区二区国语 | 韩国女主播在线大尺无遮挡 | 日韩一区二区三区四区不卡 | 国产伊人网| 四虎永久在线精品国产馆v视影院 | 欧美一卡二卡科技有限公司 | 四虎免费影院在线播放 | 白丝尤物的下面被疯狂蹂躏 | www.毛片网站 | 国产一区二区三区免费在线视频 | 欧美亚洲高清日韩成人 |