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

當前位置:首頁 > 科技  > 軟件

為什么一些團隊反對使用Lombok?

來源: 責編: 時間:2024-06-21 17:25:51 157觀看
導讀一、介紹Java,作為一款非常熱門的編程語言,盡管它有著非常豐富的語言特性,完全面向對象編程,編程高度規范化,但是也有一個最受大家詬病的一個缺點:啰嗦,尤其是當你開發了很多年之后,你會明顯的感受到,相比動態語言,java 定義變

一、介紹

Java,作為一款非常熱門的編程語言,盡管它有著非常豐富的語言特性,完全面向對象編程,編程高度規范化,但是也有一個最受大家詬病的一個缺點:啰嗦,尤其是當你開發了很多年之后,你會明顯的感受到,相比動態語言,java 定義變量之前,要先創建類,然后定義變量類型,每個類要寫很多的get/set/toString/hashCode/equals等等方法。1Zt28資訊網——每日最新資訊28at.com

尤其是當一個實體類,高達幾十個變量時,寫完get、set方法之后,一個實體類的長度快接近一千行。1Zt28資訊網——每日最新資訊28at.com

圖片圖片1Zt28資訊網——每日最新資訊28at.com

為了避免寫這些“羅嗦”的方法,很多程序員一直在尋覓著找一個能夠使他們擺脫這種重復勞動工作的工具,例如:idea、eclipse 開發工具的快捷生成get、set方法的工具,還有我們今天要談論的這個Lombok工具。1Zt28資訊網——每日最新資訊28at.com

二、Lombok

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

如果是idea開發工具,可以直接在preferences -> plugins里面搜索lombok,然后點擊安裝即可!1Zt28資訊網——每日最新資訊28at.com

圖片圖片1Zt28資訊網——每日最新資訊28at.com

接著,在項目工程中導入lombok依賴包!1Zt28資訊網——每日最新資訊28at.com

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

最后,只需要在對應的實體類上加上@Data注解,即可完成類屬性get/set的注入。1Zt28資訊網——每日最新資訊28at.com

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

使用@Data注解在類上,這個實體類中的屬性就不需要顯式寫get、set方法了。1Zt28資訊網——每日最新資訊28at.com

對這個類進行編譯之后,我們打開User.class文件,看看編譯后的文件內容長啥樣?1Zt28資訊網——每日最新資訊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方法。1Zt28資訊網——每日最新資訊28at.com

通過上面的例子,大家可以發現,使用@Data注解可以大大減少了代碼量,使代碼非常簡潔,這也是很多開發者熱衷于使用Lombok的主要原因。1Zt28資訊網——每日最新資訊28at.com

Lombok的工作原理是怎么實現的呢?1Zt28資訊網——每日最新資訊28at.com

由于Java的官方版本沒有提供這種快速生成方法的注解工具,類似Lombok這樣的工具,其實都是使用了從Java 6和JSR 269的Annotation Processing技術中實現方法的注入。1Zt28資訊網——每日最新資訊28at.com

簡單的說,就是使用了 Java 非公開的 API,在 javac 編譯代碼時,通過強類型轉換獲取JavacAnnotationProcessor對象,再從JavacAnnotationProcessor的方法里面拿到抽象語法樹(AST)做強制修改,注入get、set等方法。1Zt28資訊網——每日最新資訊28at.com

使用Lombok這種方案,有個最大的好處,就是可以節省大量的重復代碼,讓代碼更佳簡潔!但是也有很多弊端!1Zt28資訊網——每日最新資訊28at.com

三、有哪些壞處呢?

3.1、強迫隊友也安裝 Lombok

當你在使用Lombok工具插件來快速開發項目的時候,如果別的同事也要和你一起協作開發項目,那么他不得不也要安裝Lombok插件,不然項目編譯會報錯。1Zt28資訊網——每日最新資訊28at.com

3.2、代碼可調試性降低

代碼可調試性會降低,為什么會這么說呢?1Zt28資訊網——每日最新資訊28at.com

Lombok雖然給我們節省了get和set方法的編程,但是如果我想知道類的某個屬性被哪些方法操作給set了,如果用原生的方法,可以很好的知道調用方。但是如果使用Lombok插件來生成,這個時候你根本無從得知。甚至沒辦法調試!1Zt28資訊網——每日最新資訊28at.com

3.3、不懂 Lombok 注解,會踩坑

我們知道,使用@Data會重寫hashCode()和equals()方法,如果是單個實體類,沒有繼承的話,你使用@Data不會產生問題。1Zt28資訊網——每日最新資訊28at.com

但是如果這個實體類又繼承了父類,@Data只會重寫子類的hashCode()和equals()方法,不會把父類的屬性加進去,這樣就會導致,例如當你在使用HashMap的時候,用當前這個實體類作為key,可能會得到意想不到的結果。1Zt28資訊網——每日最新資訊28at.com

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

3.4、破壞封裝性

封裝是 java 面向對象編程中非常重要的一個特性。1Zt28資訊網——每日最新資訊28at.com

例如,針對User實體類,我新家一個tag屬性,我只想暴露它的get方法,不想暴露set方法給外部,沒有用@Data注解的時候,我可以很靈活的進行編程,但是使用@Data注解之后,屬性tag被完全暴露在外界了。1Zt28資訊網——每日最新資訊28at.com

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

3.5、影響 jdk 升級

其實以上的坑點,都不算什么很大的坑點,在我看來,最大的坑點其實就是Lombok的工作原理,使用了非官方支持的 API 接口,通過程序強制植入方式來修改類,實現get、set等方法的注入。1Zt28資訊網——每日最新資訊28at.com

按照如今 JDK 的升級頻率,每半年都會推出一個新的版本,但是Lombok作為一個第三方工具,并且是由開源團隊維護的,那么他的迭代速度是無法保證的。1Zt28資訊網——每日最新資訊28at.com

假如某天JDK把這種后門堵住了,那Lombok基本上就不能用了,到時候又是個麻煩事情。1Zt28資訊網——每日最新資訊28at.com

四、總結

Lombok 作為一款非常流行的工具插件,肯定有它自身的優勢所在,到底建不建議在日常開發中使用,我個人其實是一個中立的態度,如果你們團隊的人都喜歡它,那推薦你使用,在使用之前,最好培訓一下,有哪些坑點,避免踩坑。1Zt28資訊網——每日最新資訊28at.com

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

因此大家在評估要不要在代碼中引入Lombok的時候,在想它的優點同時,能夠考慮到它會帶來的哪些問題,那么本文的目的也就達到了!1Zt28資訊網——每日最新資訊28at.com

五、參考

1、https://projectlombok.org/1Zt28資訊網——每日最新資訊28at.com

2、https://time.geekbang.org/column/article/1649071Zt28資訊網——每日最新資訊28at.com

3、http://blog.itpub.net/69908877/viewspace-2676272/1Zt28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-95558-0.html為什么一些團隊反對使用Lombok?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 接口性能優化的11個小技巧

下一篇: 如何設計一個秒殺系統,你學會了嗎?

標簽:
  • 熱門焦點
  • 官方承諾:K60至尊版將會首批升級MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版將會搭載天璣9200+處理器和獨顯芯片X7的同時,Redmi給出了官方承諾,K60至尊重大更新首批升級,會首批推送MIUI 15。也就是說雖然
  • 5月iOS設備好評榜:iPhone 14僅排第43?

    來到新的一月,安兔兔的各個榜單又重新匯總了數據,像安卓陣營的榜單都有著比較大的變動,不過iOS由于設備的更新換代并沒有那么快,所以相對來說變化并不大,特別是iOS好評榜,老款設
  • 掘力計劃第 20 期:Flutter 混合開發的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發實戰詳解》作者,掘金優秀作者,Github GSY 系列目負責人戀貓的小郭分享了Flutter 混合開發的混亂之治。Flutter 基于自研的 Skia 引擎
  • 從 Pulsar Client 的原理到它的監控面板

    背景前段時間業務團隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產者消息發送緩慢等各種問題。雖然我們有個監控頁面可以根據 topic 維度查看他的發送狀態,
  • 微信語音大揭秘:為什么禁止轉發?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉發?這是一個我們經常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財經(niudaocaijing)7月5日,企鵝FM發布官方公告稱由于業務調整,將于9月6日正式停止運營,這意味著騰訊音樂長音頻業務走向消亡。騰訊在長音頻領域還在摸索。為
  • 拼多多APP上線本地生活入口,群雄逐鹿萬億市場

    Tech星球(微信ID:tech618)文 | 陳橋輝 Tech星球獨家獲悉,拼多多在其APP內上線了&ldquo;本地生活&rdquo;入口,位置較深,位于首頁的&ldquo;充值中心&rdquo;內,目前主要售賣美食相關的
  • 余承東:AI大模型技術的發展將會帶來下一代智能終端操作系統的智慧體驗

    8月4日消息,2023年華為開發者大會(HDC.Together)今天正式開幕,華為發布HarmonyOS 4、全新升級的鴻蒙開發套件、HarmonyOS Next開發者預覽版本等一系列
  • OPPO K11評測:旗艦級IMX890加持 2000元檔最強影像手機

    【Techweb評測】中端機型用戶群體巨大,占了中國目前手機市場的大頭,一直以來都是各手機品牌的“必爭之地”,其中OPPO K系列機型一直以來都以高品質、
Top 主站蜘蛛池模板: 类乌齐县| 麦盖提县| 获嘉县| 兴山县| 循化| 霸州市| 汉源县| 平陆县| 固安县| 廊坊市| 长子县| 沁阳市| 阿拉善右旗| 新竹县| 巨鹿县| 兰溪市| 基隆市| 康马县| 太和县| 富宁县| 太原市| 青浦区| 呼玛县| 璧山县| 股票| 龙门县| 邹城市| 东源县| 凤台县| 广西| 湘西| 石渠县| 贞丰县| 太仓市| 镇江市| 临漳县| 昂仁县| 西城区| 邻水| 九龙城区| 绥芬河市|