成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

新來(lái)個(gè)技術(shù)總監(jiān),禁止我們使用Lombok!

新聞
Lombok 是一款非常實(shí)用 Java 工具,可用來(lái)幫助開(kāi)發(fā)人員消除 Java 的冗長(zhǎng)代碼,尤其是對(duì)于簡(jiǎn)單的 Java 對(duì)象(POJO)

“我有個(gè)學(xué)弟,在一家小型互聯(lián)網(wǎng)公司做 Java 后端開(kāi)發(fā),最近他們公司新來(lái)了一個(gè)技術(shù)總監(jiān)。

[[314790]]

圖片來(lái)自 Pexels

這位技術(shù)總監(jiān)對(duì)技術(shù)細(xì)節(jié)很看重,一來(lái)公司之后就推出了很多"政策",比如定義了很多開(kāi)發(fā)規(guī)范、日志規(guī)范、甚至是要求大家統(tǒng)一使用某一款 IDE。

但是這些都不是我這個(gè)學(xué)弟和我吐槽的點(diǎn),他真正和我吐槽的是,他很不能理解,這位新來(lái)的技術(shù)總監(jiān)竟然禁止公司內(nèi)部所有開(kāi)發(fā)使用 Lombok。但是又沒(méi)給出十分明確的,可以讓人信服的理由。

于是他來(lái)找我聊天,問(wèn)我這個(gè)要求到底是否合理。關(guān)于這個(gè)事情,我認(rèn)為這位技術(shù)總監(jiān)的出發(fā)點(diǎn)是好的,但是做法未免有些極端。

之所以說(shuō)出發(fā)點(diǎn)是好的,是因?yàn)槭褂?Lombok 確實(shí)會(huì)帶來(lái)很多問(wèn)題,而且我個(gè)人在工作中也基本不主動(dòng)使用。

之所以說(shuō)不主動(dòng)使用,那是因?yàn)橛行┩碌拇a還是使用了的,所以我也被迫的要安裝 Lombok 的插件。

既然聊到這個(gè)話(huà)題,就簡(jiǎn)單說(shuō)說(shuō)我的一些看法。

Lombok 有什么好處?

Lombok 是一款非常實(shí)用 Java 工具,可用來(lái)幫助開(kāi)發(fā)人員消除 Java 的冗長(zhǎng)代碼,尤其是對(duì)于簡(jiǎn)單的 Java 對(duì)象(POJO)。它通過(guò)注釋實(shí)現(xiàn)這一目的。

如果大家對(duì)于 Lombok 比較了解的話(huà),可以先跳過(guò)這一段,直接往后看,如果不是很熟悉的話(huà),可以簡(jiǎn)單了解一下。

想在項(xiàng)目中使用 Lombok,需要三個(gè)步驟:

①I(mǎi)DE 中安裝 Lombok 插件

目前 Lombok 支持多種 IDE,其中包括主流的 Eclipse、Intellij IDEA、Myeclipse 等都是支持的。

在 IDEA 中安裝方式如下:

②導(dǎo)入相關(guān)依賴(lài)

Lombok 支持使用多重構(gòu)建工具進(jìn)行導(dǎo)入依賴(lài),目前主要支持 maven、gardle、ant 等。

如使用 maven 導(dǎo)入方式如下:

  1. <dependency> 
  2.     <groupId>org.projectlombok</groupId> 
  3.     <artifactId>lombok</artifactId> 
  4.     <version>1.18.12</version> 
  5.     <scope>provided</scope> 
  6. </dependency> 

③代碼中使用注解

Lombok 精簡(jiǎn)代碼的方式主要是通過(guò)注解來(lái)實(shí)現(xiàn),其中常用的有 @Data、@Getter/@Setter、@Builder、@NonNull 等。

如使用 @Data 注解,即可簡(jiǎn)單的定義一個(gè) Java Bean:

  1. import lombok.Data; 
  2. @Data 
  3. public class Menu { 
  4.     private String shopId; 
  5.     private String skuMenuId; 
  6.     private String skuName; 

使用 @Data 注解在類(lèi)上,相當(dāng)于同時(shí)使用了 @ToString、@EqualsAndHashCode、@Getter、@Setter 和 @RequiredArgsConstrutor 這些注解,對(duì)于 POJO 類(lèi)十分有用。

即自動(dòng)幫忙給例子中的 Menu 類(lèi)中定義了 toString、Getter、Setter 等方法。

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

另外,關(guān)于 Lombok 的使用,不同人有不同的看法,因?yàn)楹芏嗳硕际褂眠^(guò) Lombok,對(duì)于他的優(yōu)點(diǎn)都比較了解,所以接下來(lái)我們重點(diǎn)說(shuō)一下 Lombok 的使用會(huì)帶來(lái)哪些問(wèn)題。

Lombok 有什么壞處?

強(qiáng) X 隊(duì)友

因?yàn)?Lombok 的使用要求開(kāi)發(fā)者一定要在 IDE 中安裝對(duì)應(yīng)的插件。

如果未安裝插件的話(huà),使用 IDE 打開(kāi)一個(gè)基于 Lombok 的項(xiàng)目的話(huà)會(huì)提示找不到方法等錯(cuò)誤。導(dǎo)致項(xiàng)目編譯失敗。

也就是說(shuō),如果項(xiàng)目組中有一個(gè)人使用了 Lombok,那么其他人就必須也要安裝 IDE 插件。否則就沒(méi)辦法協(xié)同開(kāi)發(fā)。

更重要的是,如果我們定義的一個(gè) jar 包中使用了 Lombok,那么就要求所有依賴(lài)這個(gè) jar 包的所有應(yīng)用都必須安裝插件,這種侵入性是很高的。

代碼可讀性,可調(diào)試性低

在代碼中使用了 Lombok,確實(shí)可以幫忙減少很多代碼,因?yàn)?Lombok 會(huì)幫忙自動(dòng)生成很多代碼。

但是這些代碼是要在編譯階段才會(huì)生成的,所以在開(kāi)發(fā)的過(guò)程中,其實(shí)很多代碼是缺失的。

在代碼中大量使用 Lombok,就導(dǎo)致代碼的可讀性會(huì)低很多,而且也會(huì)給代碼調(diào)試帶來(lái)一定的問(wèn)題。

比如,我們想要知道某個(gè)類(lèi)中的某個(gè)屬性的 getter 方法都被哪些類(lèi)引用的話(huà),就沒(méi)那么簡(jiǎn)單了。

有坑

因?yàn)?Lombok 使代碼開(kāi)發(fā)非常簡(jiǎn)便,這就使得部分開(kāi)發(fā)者對(duì)其產(chǎn)生過(guò)度依賴(lài)。

在使用 Lombok 過(guò)程中,如果對(duì)于各種注解的底層原理不理解的話(huà),很容易產(chǎn)生意想不到的結(jié)果。

舉一個(gè)簡(jiǎn)單的例子,我們知道,當(dāng)我們使用 @Data 定義一個(gè)類(lèi)的時(shí)候,會(huì)自動(dòng)幫我們生成 equals() 方法 。

但是如果只使用了 @Data,而不使用 @EqualsAndHashCode(callSuper=true) 的話(huà),會(huì)默認(rèn)是 @EqualsAndHashCode(callSuper=false)。

這時(shí)候生成的 equals() 方法只會(huì)比較子類(lèi)的屬性,不會(huì)考慮從父類(lèi)繼承的屬性,無(wú)論父類(lèi)屬性訪(fǎng)問(wèn)權(quán)限是否開(kāi)放。這就可能得到意想不到的結(jié)果。

影響升級(jí)

因?yàn)?Lombok 對(duì)于代碼有很強(qiáng)的侵入性,就可能帶來(lái)一個(gè)比較大的問(wèn)題,那就是會(huì)影響我們對(duì) JDK 的升級(jí)。

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

所以,如果我們需要升級(jí)到某個(gè)新版本的 JDK 的時(shí)候,若其中的特性在 Lombok 中不支持的話(huà)就會(huì)受到影響。

還有一個(gè)可能帶來(lái)的問(wèn)題,就是 Lombok 自身的升級(jí)也會(huì)受到限制。

因?yàn)橐粋€(gè)應(yīng)用可能依賴(lài)了多個(gè) jar 包,而每個(gè) jar 包可能又要依賴(lài)不同版本的 Lombok。

這就導(dǎo)致在應(yīng)用中需要做版本仲裁,而我們知道,jar 包版本仲裁是沒(méi)那么容易的,而且發(fā)生問(wèn)題的概率也很高。

破壞封裝性

以上幾個(gè)問(wèn)題,我認(rèn)為都是有辦法可以避免的。但是有些人排斥使用 Lombok 還有一個(gè)重要的原因,那就是他會(huì)破壞封裝性。

眾所周知,Java 的三大特性包括封裝性、繼承性和多態(tài)性。

如果我們?cè)诖a中直接使用 Lombok,那么他會(huì)自動(dòng)幫我們生成 getter、setter 等方法,這就意味著,一個(gè)類(lèi)中的所有參數(shù)都自動(dòng)提供了設(shè)置和讀取方法。

舉個(gè)簡(jiǎn)單的例子,我們定義一個(gè)購(gòu)物車(chē)類(lèi):

  1. @Data 
  2. public class ShoppingCart {  
  3.     //商品數(shù)目 
  4.     private int itemsCount;  
  5.     //總價(jià)格 
  6.     private double totalPrice;  
  7.     //商品明細(xì) 
  8.     private List items = new ArrayList<>(); 

我們知道,購(gòu)物車(chē)中商品數(shù)目、商品明細(xì)以及總價(jià)格三者之前其實(shí)是有關(guān)聯(lián)關(guān)系的,如果需要修改的話(huà)是要一起修改的。

但是,我們使用了 Lombok 的 @Data 注解,對(duì)于 itemsCount 和 totalPrice 這兩個(gè)屬性,雖然我們將它們定義成 private 類(lèi)型,但是提供了 public 的 getter、setter 方法。

外部可以通過(guò) setter 方法隨意地修改這兩個(gè)屬性的值。我們可以隨意調(diào)用 setter 方法,來(lái)重新設(shè)置 itemsCount、totalPrice 屬性的值,這也會(huì)導(dǎo)致其跟 items 屬性的值不一致。

而面向?qū)ο蠓庋b的定義是:通過(guò)訪(fǎng)問(wèn)權(quán)限控制,隱藏內(nèi)部數(shù)據(jù),外部?jī)H能通過(guò)類(lèi)提供的有限的接口訪(fǎng)問(wèn)、修改內(nèi)部數(shù)據(jù)。所以,暴露不應(yīng)該暴露的 setter 方法,明顯違反了面向?qū)ο蟮姆庋b特性。

好的做法應(yīng)該是不提供 getter/setter,而是只提供一個(gè) public 的 addItem 方法,同時(shí)去修改 itemsCount、totalPrice 以及 items 三個(gè)屬性。

總結(jié)

本文總結(jié)了常用的 Java 開(kāi)發(fā)工具 Lombok 的優(yōu)缺點(diǎn)。

優(yōu)點(diǎn)是使用注解即可幫忙自動(dòng)生成代碼,大大減少了代碼量,使代碼非常簡(jiǎn)潔。

但是并不意味著 Lombok 的使用沒(méi)有任何問(wèn)題,在使用 Lombok 的過(guò)程中,還可能存在對(duì)隊(duì)友不友好、對(duì)代碼不友好、對(duì)調(diào)試不友好、對(duì)升級(jí)不友好等問(wèn)題。

最重要的是,使用 Lombok 還會(huì)導(dǎo)致破壞封裝性的問(wèn)題。雖然使用 Lombok 存在著很多方便,但是也帶來(lái)了一些問(wèn)題。

但是到底建不建議在日常開(kāi)發(fā)中使用,我其實(shí)保持一個(gè)中立的態(tài)度,不建議大家過(guò)度依賴(lài),也不要求大家一定要徹底不用。

只要大家在使用的過(guò)程中,或者評(píng)估要不要在代碼中引入 Lombok 之前,在想到他的優(yōu)點(diǎn)的同時(shí),能夠考慮到他給代碼帶來(lái)的問(wèn)題的,那么本文的目的也就達(dá)到了!

 

責(zé)任編輯:武曉燕 來(lái)源: Java之道
相關(guān)推薦

2020-02-12 14:03:25

實(shí)用Java工具

2023-07-26 00:46:25

GitMain主分支

2022-07-04 09:43:46

RabbitMQ消息消息隊(duì)列

2022-01-17 09:41:43

布爾類(lèi)型接口

2023-01-04 17:19:21

MQ消息中間件

2025-04-27 08:00:00

分布式 ID分布式系統(tǒng)ID

2013-09-27 11:33:57

交換機(jī)技術(shù)Vlan技術(shù)

2011-04-22 11:25:17

2020-02-25 17:03:29

技術(shù)研發(fā)指標(biāo)

2009-04-05 10:26:47

2013-11-14 09:58:23

紅帽redhat

2022-02-24 10:47:38

Lombok代碼Java

2020-02-25 09:50:33

技術(shù)研發(fā)指標(biāo)

2019-05-13 08:51:53

總監(jiān)技術(shù)CTO

2023-02-03 08:21:55

2019-11-27 10:05:00

LombokJava編程

2019-05-06 10:51:49

總監(jiān)技術(shù)場(chǎng)景

2011-05-18 09:21:55

英特爾ARM

2012-07-09 20:18:01

2021-01-15 08:00:31

日志技術(shù)Log4j
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲国产精品一区二区三区 | 在线一区 | 午夜影视 | 日韩免费一区二区 | 亚洲国产一区在线 | 亚洲成人精选 | 成人三级网址 | 不卡的av电影 | 久久人操 | 天天操狠狠操 | 99热热热| 欧美日韩电影一区二区 | 久久网一区二区 | 日本电影一区二区 | 精品国产乱码久久久久久蜜柚 | 欧美色综合一区二区三区 | 免费在线观看一区二区 | 国产精品麻 | 亚洲国产精久久久久久久 | 爱草在线| 国产99精品 | 伊人免费在线观看 | 欧美精品91爱爱 | 亚洲国产成人精品女人 | 日韩成人精品一区二区三区 | 午夜视频精品 | 亚洲精品在线观看视频 | 亚洲精品456 | 久久久视 | 亚洲精品国产第一综合99久久 | 久热精品视频 | 欧美视频一区 | 亚洲精品久久久久久国产精华液 | 亚洲精品久久久蜜桃 | 国产福利资源在线 | 久草网在线视频 | 久久久久久亚洲 | 欧美网址在线观看 | 2022国产精品 | 国产1页| 亚洲国产aⅴ成人精品无吗 综合国产在线 |