日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

為什么一些團(tuán)隊(duì)反對(duì)使用Lombok?

來(lái)源: 責(zé)編: 時(shí)間:2024-06-21 17:25:51 255觀看
導(dǎo)讀一、介紹Java,作為一款非常熱門(mén)的編程語(yǔ)言,盡管它有著非常豐富的語(yǔ)言特性,完全面向?qū)ο缶幊蹋幊谈叨纫?guī)范化,但是也有一個(gè)最受大家詬病的一個(gè)缺點(diǎn):?jiǎn)拢绕涫钱?dāng)你開(kāi)發(fā)了很多年之后,你會(huì)明顯的感受到,相比動(dòng)態(tài)語(yǔ)言,java 定義變

一、介紹

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

尤其是當(dāng)一個(gè)實(shí)體類,高達(dá)幾十個(gè)變量時(shí),寫(xiě)完get、set方法之后,一個(gè)實(shí)體類的長(zhǎng)度快接近一千行。mSO28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片mSO28資訊網(wǎng)——每日最新資訊28at.com

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

二、Lombok

Lombok 是一款非常流行的代碼簡(jiǎn)潔工具,利用它的注解特性,直接就可以幫我們省去高大幾百行的get、set方法,操作非常方便。mSO28資訊網(wǎng)——每日最新資訊28at.com

如果是idea開(kāi)發(fā)工具,可以直接在preferences -> plugins里面搜索lombok,然后點(diǎn)擊安裝即可!mSO28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片mSO28資訊網(wǎng)——每日最新資訊28at.com

接著,在項(xiàng)目工程中導(dǎo)入lombok依賴包!mSO28資訊網(wǎng)——每日最新資訊28at.com

<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.12</version>    <scope>provided</scope></dependency>

最后,只需要在對(duì)應(yīng)的實(shí)體類上加上@Data注解,即可完成類屬性get/set的注入。mSO28資訊網(wǎng)——每日最新資訊28at.com

import lombok.Data;@Datapublic class User {    private String id;    private String age;    private String name;        //可以不用顯式寫(xiě)get、set方法}

使用@Data注解在類上,這個(gè)實(shí)體類中的屬性就不需要顯式寫(xiě)get、set方法了。mSO28資訊網(wǎng)——每日最新資訊28at.com

對(duì)這個(gè)類進(jìn)行編譯之后,我們打開(kāi)User.class文件,看看編譯后的文件內(nèi)容長(zhǎng)啥樣?mSO28資訊網(wǎng)——每日最新資訊28at.com

public class User {    private String id;    private String age;    private String name;    public User() {    }    public String getId() {        return this.id;    }    public String getAge() {        return this.age;    }    public String getName() {        return this.name;    }    public void setId(String id) {        this.id = id;    }    public void setAge(String age) {        this.age = age;    }    public void setName(String name) {        this.name = name;    }    public boolean equals(Object o) {        if (o == this) {            return true;        } else if (!(o instanceof User)) {            return false;        } else {            User other = (User)o;            if (!other.canEqual(this)) {                return false;            } else {                label47: {                    Object this$id = this.getId();                    Object other$id = other.getId();                    if (this$id == null) {                        if (other$id == null) {                            break label47;                        }                    } else if (this$id.equals(other$id)) {                        break label47;                    }                    return false;                }                Object this$age = this.getAge();                Object other$age = other.getAge();                if (this$age == null) {                    if (other$age != null) {                        return false;                    }                } else if (!this$age.equals(other$age)) {                    return false;                }                Object this$name = this.getName();                Object other$name = other.getName();                if (this$name == null) {                    if (other$name != null) {                        return false;                    }                } else if (!this$name.equals(other$name)) {                    return false;                }                return true;            }        }    }    protected boolean canEqual(Object other) {        return other instanceof User;    }    public int hashCode() {        int PRIME = true;        int result = 1;        Object $id = this.getId();        int result = result * 59 + ($id == null ? 43 : $id.hashCode());        Object $age = this.getAge();        result = result * 59 + ($age == null ? 43 : $age.hashCode());        Object $name = this.getName();        result = result * 59 + ($name == null ? 43 : $name.hashCode());        return result;    }    public String toString() {        return "User(id=" + this.getId() + ", age=" + this.getAge() + ", name=" + this.getName() + ")";    }}

很清晰的看到,使用@Data注解之后,User類新增了get、set、hashCode、equals和toString方法。mSO28資訊網(wǎng)——每日最新資訊28at.com

通過(guò)上面的例子,大家可以發(fā)現(xiàn),使用@Data注解可以大大減少了代碼量,使代碼非常簡(jiǎn)潔,這也是很多開(kāi)發(fā)者熱衷于使用Lombok的主要原因。mSO28資訊網(wǎng)——每日最新資訊28at.com

Lombok的工作原理是怎么實(shí)現(xiàn)的呢?mSO28資訊網(wǎng)——每日最新資訊28at.com

由于Java的官方版本沒(méi)有提供這種快速生成方法的注解工具,類似Lombok這樣的工具,其實(shí)都是使用了從Java 6和JSR 269的Annotation Processing技術(shù)中實(shí)現(xiàn)方法的注入。mSO28資訊網(wǎng)——每日最新資訊28at.com

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

使用Lombok這種方案,有個(gè)最大的好處,就是可以節(jié)省大量的重復(fù)代碼,讓代碼更佳簡(jiǎn)潔!但是也有很多弊端!mSO28資訊網(wǎng)——每日最新資訊28at.com

三、有哪些壞處呢?

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

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

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

代碼可調(diào)試性會(huì)降低,為什么會(huì)這么說(shuō)呢?mSO28資訊網(wǎng)——每日最新資訊28at.com

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

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

我們知道,使用@Data會(huì)重寫(xiě)hashCode()和equals()方法,如果是單個(gè)實(shí)體類,沒(méi)有繼承的話,你使用@Data不會(huì)產(chǎn)生問(wèn)題。mSO28資訊網(wǎng)——每日最新資訊28at.com

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

遇到這種情況,你可以在類上加上這個(gè)注解@EqualsAndHashCode(callSuper=true),子類的hashCode()和equals()方法會(huì)加入父類的屬性。mSO28資訊網(wǎng)——每日最新資訊28at.com

3.4、破壞封裝性

封裝是 java 面向?qū)ο缶幊讨蟹浅V匾囊粋€(gè)特性。mSO28資訊網(wǎng)——每日最新資訊28at.com

例如,針對(duì)User實(shí)體類,我新家一個(gè)tag屬性,我只想暴露它的get方法,不想暴露set方法給外部,沒(méi)有用@Data注解的時(shí)候,我可以很靈活的進(jìn)行編程,但是使用@Data注解之后,屬性tag被完全暴露在外界了。mSO28資訊網(wǎng)——每日最新資訊28at.com

public class User {    private String id;    private String age;    private String name;    private String tag = "學(xué)生";    public String getTag() {        return tag;    }    }

3.5、影響 jdk 升級(jí)

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

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

假如某天JDK把這種后門(mén)堵住了,那Lombok基本上就不能用了,到時(shí)候又是個(gè)麻煩事情。mSO28資訊網(wǎng)——每日最新資訊28at.com

四、總結(jié)

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

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

因此大家在評(píng)估要不要在代碼中引入Lombok的時(shí)候,在想它的優(yōu)點(diǎn)同時(shí),能夠考慮到它會(huì)帶來(lái)的哪些問(wèn)題,那么本文的目的也就達(dá)到了!mSO28資訊網(wǎng)——每日最新資訊28at.com

五、參考

1、https://projectlombok.org/mSO28資訊網(wǎng)——每日最新資訊28at.com

2、https://time.geekbang.org/column/article/164907mSO28資訊網(wǎng)——每日最新資訊28at.com

3、http://blog.itpub.net/69908877/viewspace-2676272/mSO28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-95558-0.html為什么一些團(tuán)隊(duì)反對(duì)使用Lombok?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 接口性能優(yōu)化的11個(gè)小技巧

下一篇: 如何設(shè)計(jì)一個(gè)秒殺系統(tǒng),你學(xué)會(huì)了嗎?

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲一区二区三区成人在线视频精品| 黄色精品一二区| 欧美精品高清视频| 欧美激情国产日韩| 欧美日韩三级一区二区| 欧美日韩在线视频观看| 国产精品www994| 国产婷婷色一区二区三区四区| 国产一区二区三区电影在线观看 | 亚洲第一精品电影| 依依成人综合视频| 日韩视频在线免费观看| 亚洲一卡久久| 久久国产一二区| 欧美成人日本| 国产精品乱人伦一区二区 | 国产精品免费网站| 国产一区美女| 亚洲欧洲综合另类在线| 亚洲午夜一区二区三区| 久久精品夜色噜噜亚洲a∨| 欧美 日韩 国产 一区| 欧美性理论片在线观看片免费| 国产欧美在线播放| 最新热久久免费视频| 亚洲自拍偷拍福利| 老鸭窝毛片一区二区三区| 欧美色精品在线视频| 国产手机视频精品| 日韩视频免费大全中文字幕| 欧美亚洲综合另类| 欧美夫妇交换俱乐部在线观看| 国产精品久久国产三级国电话系列 | 欧美极品一区二区三区| 国产美女精品人人做人人爽| 亚洲激情综合| 久久成人资源| 欧美日韩综合在线免费观看| 国内视频一区| 亚洲午夜精品| 欧美大尺度在线观看| 国产日产欧美精品| 9人人澡人人爽人人精品| 久久精品国产免费观看| 欧美特黄视频| 亚洲国产精品va| 欧美在线播放| 欧美网站大全在线观看| 亚洲国产免费看| 欧美在线中文字幕| 欧美视频免费看| 亚洲欧洲一区二区在线观看| 久久精品二区| 国产精品视频第一区| 日韩手机在线导航| 美女国产一区| 国产一区二区三区奇米久涩 | 中文亚洲字幕| 欧美1级日本1级| 国产一区二区成人久久免费影院| 艳妇臀荡乳欲伦亚洲一区| 久久嫩草精品久久久精品| 国产精品视频观看| 一区二区免费在线观看| 免费成人高清| 一区二区三区在线视频免费观看| 午夜精品久久久久久久久久久久久| 欧美精品18+| 亚洲高清在线观看| 久久久精品五月天| 国产区亚洲区欧美区| 亚洲午夜羞羞片| 欧美日韩卡一卡二| 亚洲毛片av在线| 欧美大胆a视频| 亚洲国产精品久久久久秋霞影院 | 亚洲夜间福利| 欧美日韩视频一区二区| 亚洲美女在线视频| 欧美精品麻豆| 亚洲精品资源| 欧美精品一区二区三区久久久竹菊| 在线精品观看| 裸体一区二区三区| 在线看日韩av| 美日韩丰满少妇在线观看| 欧美日韩亚洲一区三区| 日韩午夜在线电影| 欧美美女喷水视频| 99re6热在线精品视频播放速度| 欧美韩日一区| 亚洲精选视频免费看| 欧美精品一区视频| 日韩一区二区精品视频| 欧美美女福利视频| 一区二区三区黄色| 欧美午夜视频| 亚洲综合999| 国产精品一区久久久| 午夜视频在线观看一区二区| 国产欧美日韩在线视频| 久久国产精品久久久久久| 国产一区二区三区免费不卡| 久久精视频免费在线久久完整在线看| 国模 一区 二区 三区| 久久亚洲美女| 亚洲欧洲另类| 亚洲成色777777在线观看影院| 久久综合色8888| 亚洲国产婷婷| 欧美日韩第一页| 亚洲一区二区三区精品动漫| 国产精品一区二区久久| 久久精品国产亚洲aⅴ| 一区视频在线| 欧美精品激情在线观看| 一区二区三区视频在线观看 | 国产精品一区二区三区久久久| 久久爱另类一区二区小说| 在线观看亚洲视频| 欧美日韩123| 午夜日韩福利| 亚洲丶国产丶欧美一区二区三区 | 国产日韩精品一区| 蜜臀av国产精品久久久久| 亚洲乱码国产乱码精品精天堂| 国产精品久久久999| 久久黄色网页| 亚洲乱码国产乱码精品精可以看 | 国产视频自拍一区| 美日韩精品视频| 一区二区高清在线观看| 国产日韩亚洲欧美| 免费国产一区二区| 亚洲色在线视频| 国产欧美视频在线观看| 久久久久久网| 亚洲精品一二三| 欧美性猛交xxxx乱大交蜜桃| 欧美在线视频不卡| 亚洲高清精品中出| 老司机精品视频一区二区三区| 一区二区三区高清| 国产亚洲欧美日韩日本| 欧美韩国日本综合| 亚洲欧美日产图| 91久久久亚洲精品| 国产精品一区一区| 猛干欧美女孩| 亚洲特级毛片| 国产欧美一区二区精品仙草咪| 欧美电影在线| 亚洲一区国产视频| 黄色国产精品| 欧美三级免费| 欧美中文字幕第一页| 99精品视频免费在线观看| 国产欧美在线观看| 欧美国产视频一区二区| 亚洲欧美国产精品桃花| 红桃视频国产精品| 欧美日韩国产一区精品一区 | 美女视频黄免费的久久| 中日韩在线视频| 国内精品一区二区| 欧美激情亚洲精品| 久久久久久香蕉网| 一本大道av伊人久久综合| 国产一区在线免费观看| 欧美美女bbbb| 免费黄网站欧美| 亚洲欧美日韩在线不卡| 亚洲国产91| 国产欧美韩国高清| 欧美福利视频在线| 久久性天堂网| 亚洲永久在线| 亚洲精品影视| 国产在线精品一区二区中文| 国产精品久久久久久久午夜| 美日韩精品视频免费看| 欧美一级理论性理论a| 亚洲美女在线视频| 在线高清一区| 国产一区二区三区在线播放免费观看| 欧美日韩亚洲一区二| 久热精品在线| 午夜欧美不卡精品aaaaa| 亚洲精品之草原avav久久| 狠狠综合久久| 国产精品综合色区在线观看| 欧美精品首页| 欧美xxx成人| 欧美自拍偷拍| 亚洲已满18点击进入久久| 亚洲乱码国产乱码精品精可以看| 国产一区二区三区四区hd| 欧美亚男人的天堂| 亚洲蜜桃精久久久久久久| 国产主播一区二区| 国产亚洲激情| 国产精品人成在线观看免费| 欧美伦理91| 欧美韩日视频|