IDEA?2022?中的Lombok?使用基礎(chǔ)教程
1.Lombok是什么
? Lombok是使用java編寫的一款開源類庫。其主作用是使用注解來代替一些具有格式固定,沒有過多技術(shù)含量的編碼工作。使我們可以僅僅在代碼中添加一個注解(annotation),就可以起到和編寫一大段代碼一樣的作用。對于這些格式固定的的代碼,IDE也提供了自動生成的功能,但是無論是自動生成還是純手動寫,這些代碼在類中是實(shí)實(shí)在在的存在,有時候,看到一個類文件很長,其中卻都是一些,沒有任何技術(shù)含量的getter和setter方法。無疑會影響我們的代碼閱讀。而使用Lombok可以將這些“無用”的代碼,通過相應(yīng)的注解替換掉。好了,廢話少說,進(jìn)入主題:
? 1.上面說的“注解”具體是哪些注解?
? 2.這些注解又能代替哪些編碼工作呢?
? 3.lombok是如何實(shí)現(xiàn)以上功能的呢?
1.1 Lombok 是什么?
官網(wǎng):https://projectlombok.org/
Lombok 是一個 Java 庫,使用 Lombok 可以通過簡單的注解幫助我們消除 Java 的樣板代碼,使代碼更加簡潔清晰。
比如對于簡單的 Java 對象(POJO),很多的代碼里充斥著大量的 getter()
和 setter()
方法,樣板代碼占用比例高,影響可讀性,引入 Lombok 只需一個注解就能達(dá)到相同效果,而且更簡潔。
Lombok 引入
2、POM 中引入依賴
使用 Lombok 注解需要依賴它的庫。
Maven 庫:https://mvnrepository.com/artifact/org.projectlombok/lombok
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency>
系統(tǒng)中如果有引入無需重復(fù)引入。
3、IDE 中安裝插件
為什么裝插件?
因為 Lombok 的引入后,java 文件使用 javac 編譯成的字節(jié)碼文件中就會包含 getter 和 setter 函數(shù),但是源代碼中找不到定義,IDE 會認(rèn)為這是錯誤,因此需要安裝一個 Lombok 的插件,方便本地 IDE 的研發(fā)工作。
IDEA 中安裝:
Settings->Plugins->輸入框輸入”lombok”
4. Lombok 使用
比如要針對以下 Java 對象提供 getter()
和 setter()
方法:
public class Mountain { private String name; private String country; }
只需要在類上打 @Getter
和 @Setter
注解。
@Getter @Setter public class Mountain { private String name; private String country; }
然后用 maven 編譯一下:mvn clean compile
。
使用的時候就可以正常拿到像 getCountry()
和 setCountry()
這樣的方法。通過 IDE 找方法調(diào)用處也可以直接鎖定到字段上,以前要點(diǎn)兩下才能看到字段明細(xì)信息,使用 Lombok 點(diǎn)一下就能達(dá)到效果。
4.1 Lombok 使用注意
- 不建議直接使用
@Data
這種大而全的方式覆蓋太多的簡化場景。 - toString 場景不建議使用 Lombok 的,建議使用系統(tǒng)自定義 ToString 里的方法。
- 對外包考慮到接入方也需要引入依賴,如果擔(dān)心副作用,可以不引入。
- 其他注解酌情使用。
5.代碼案例:
常用注解:@Getter/@Setter: 作用類上,生成所有成員變量的getter/setter方法;作用于成員變量上,生成該成員變量的getter/setter方法??梢栽O(shè)定訪問權(quán)限及是否懶加載等。
package com.libin; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; /** * Created by libin * DESC: 測試類 */ @SuppressWarnings("unused") public class TestClass { public static void main(String[] args) { } @Getter(value = AccessLevel.PUBLIC) @Setter(value = AccessLevel.PUBLIC) public static class Person { private String name; private int age; private boolean friendly; } public static class Animal { private String name; private int age; @Getter @Setter private boolean funny; } }
在Structure視圖中,可以看到已經(jīng)生成了getter/setter等方法。
編譯后的代碼如下:這也是傳統(tǒng)Java編程需要編寫的樣板代碼。
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package com.libin; public class TestClass { public TestClass() { } public static void main(String[] args) { } public static class Animal { private String name; private int age; private boolean funny; public Animal() { } public boolean isFunny() { return this.funny; } public void setFunny(boolean funny) { this.funny = funny; } } public static class Person { private String name; private int age; private boolean friendly; public Person() { } public String getName() { return this.name; } public int getAge() { return this.age; } public boolean isFriendly() { return this.friendly; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setFriendly(boolean friendly) { this.friendly = friendly; } } }
@ToString:作用于類,覆蓋默認(rèn)的toString()方法,可以通過of屬性限定顯示某些字段,通過exclude屬性排除某些字段。
@EqualsAndHashCode:作用于類,覆蓋默認(rèn)的equals和hashCode
@NonNull:主要作用于成員變量和參數(shù)中,標(biāo)識不能為空,否則拋出空指針異常。
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:作用于類上,用于生成構(gòu)造函數(shù)。有staticName、access等屬性。
staticName屬性一旦設(shè)定,將采用靜態(tài)方法的方式生成實(shí)例,access屬性可以限定訪問權(quán)限。
@NoArgsConstructor:生成無參構(gòu)造器;
@RequiredArgsConstructor:生成包含final和@NonNull注解的成員變量的構(gòu)造器;
@AllArgsConstructor:生成全參構(gòu)造器。
編譯后結(jié)果:
public static class Person { @NonNull private String name; private int age; private boolean friendly; public String toString() { return "TestClass.Person(name=" + this.getName() + ", age=" + this.getAge() + ")"; } @NonNull public String getName() { return this.name; } public int getAge() { return this.age; } public boolean isFriendly() { return this.friendly; } public void setName(@NonNull String name) { if(name == null) { throw new NullPointerException("name"); } else { this.name = name; } } public void setAge(int age) { this.age = age; } public void setFriendly(boolean friendly) { this.friendly = friendly; } private Person() { } private static TestClass.Person of() { return new TestClass.Person(); } @ConstructorProperties({"name"}) Person(@NonNull String name) { if(name == null) { throw new NullPointerException("name"); } else { this.name = name; } } @ConstructorProperties({"name", "age", "friendly"}) public Person(@NonNull String name, int age, boolean friendly) { if(name == null) { throw new NullPointerException("name"); } else { this.name = name; this.age = age; this.friendly = friendly; } } }
@Data
:作用于類上,是以下注解的集合:
@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor
@Builder:作用于類上,將類轉(zhuǎn)變?yōu)榻ㄔ煺吣J?/p>
@Log:作用于類上,生成日志變量。針對不同的日志實(shí)現(xiàn)產(chǎn)品,有不同的注解:
其他重要注解:
@Cleanup:自動關(guān)閉資源,針對實(shí)現(xiàn)了java.io.Closeable接口的對象有效,如:典型的IO流對象。
編譯后結(jié)果如下:
是不是簡潔了太多。
@SneakyThrows:可以對受檢異常進(jìn)行捕捉并拋出,可以改寫上述的main方法如下。
@Synchronized:作用于方法級別,可以替換synchronize關(guān)鍵字或lock鎖,用處不大。
Lombok 原理
自 JDK6 之后,javac 在執(zhí)行的時候會調(diào)用實(shí)現(xiàn)了 JSR 269 API 的程序,這樣我們就可以對編譯器做一些增強(qiáng),這時 javac
執(zhí)行的過程如下:
Lombok 本質(zhì)上就是一個實(shí)現(xiàn)了“JSR 269 API”的程序。在使用 javac
的過程中,它產(chǎn)生作用的具體流程如下:
javac
對源代碼進(jìn)行分析,生成一棵抽象語法樹(AST)- 運(yùn)行過程中調(diào)用實(shí)現(xiàn)了“
JSR 269 API
”的Lombok
程序 - Lombok 對第一步驟得到的 AST 進(jìn)行處理,找到
@Getter @Setter
注解所在類對應(yīng)的語法樹(AST) - Lombok 修改該語法樹(AST),增加
getter()
和setter()
方法定義的相應(yīng)樹節(jié)點(diǎn) - javac 使用修改后的抽象語法樹(AST)生成字節(jié)碼文件,即給 class 增加新的節(jié)點(diǎn)(代碼塊)
6. 常用注解
@Data
:相當(dāng)于@Setter + Getter + @ToString + @EqualsAndHashCode
@NoArgsConstructor
:自動生成無參數(shù)構(gòu)造函數(shù)。@AllArgsConstructor
:自動生成全參數(shù)構(gòu)造函數(shù)。
三個常用注解~~~~
到此這篇關(guān)于IDEA 2022 中的Lombok 使用基礎(chǔ)教程的文章就介紹到這了,更多相關(guān)IDEA 2022 Lombok 使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot關(guān)閉druid監(jiān)控 druid2改配置文件無效的解決
這篇文章主要介紹了springboot關(guān)閉druid監(jiān)控 druid2改配置文件無效的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05Java數(shù)據(jù)結(jié)構(gòu)之順序表和鏈表精解
我在學(xué)習(xí)完順序表后一直對順序表和鏈表的概念存在一些疑問,這里給出一些分析和看法,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下2021-09-09基于Spring AMQP實(shí)現(xiàn)消息隊列的示例代碼
Spring AMQP作為Spring框架的一部分,是一套用于支持高級消息隊列協(xié)議(AMQP)的工具,AMQP是一種強(qiáng)大的消息協(xié)議,旨在支持可靠的消息傳遞,本文給大家介紹了如何基于Spring AMQP實(shí)現(xiàn)消息隊列,需要的朋友可以參考下2024-03-03Socket+JDBC+IO實(shí)現(xiàn)Java文件上傳下載器DEMO詳解
這篇文章主要介紹了Socket+JDBC+IO實(shí)現(xiàn)Java文件上傳下載器DEMO詳解,需要的朋友可以參考下2017-05-05阿里Druid數(shù)據(jù)連接池引發(fā)的線上異常解決
這篇文章主要為大家介紹了一次關(guān)于阿里Druid數(shù)據(jù)連接池引發(fā)的線上異常問題的解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03SpringBoot框架集成token實(shí)現(xiàn)登錄校驗功能
這篇文章主要為大家詳細(xì)介紹了SpringBoot框架集成token實(shí)現(xiàn)登錄校驗功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08SpringBoot?+?layui?框架實(shí)現(xiàn)一周免登陸功能示例詳解
這篇文章主要介紹了SpringBoot+layui框架實(shí)現(xiàn)一周免登陸功能,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08