<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Lombok是使用java編寫的一款開源類庫。其主作用是使用註解來代替一些具有格式固定,沒有過多技術含量的編碼工作。使我們可以僅僅在程式碼中新增一個註解(annotation),就可以起到和編寫一大段程式碼一樣的作用。對於這些格式固定的的程式碼,IDE也提供了自動生成的功能,但是無論是自動生成還是純手動寫,這些程式碼在類中是實實在在的存在,有時候,看到一個類檔案很長,其中卻都是一些,沒有任何技術含量的getter和setter方法。無疑會影響我們的程式碼閱讀。而使用Lombok可以將這些“無用”的程式碼,通過相應的註解替換掉。好了,廢話少說,進入主題:
1.上面說的“註解”具體是哪些註解?
2.這些註解又能代替哪些編碼工作呢?
3.lombok是如何實現以上功能的呢?
官網:https://projectlombok.org/
Lombok 是一個 Java 庫,使用 Lombok 可以通過簡單的註解幫助我們消除 Java 的樣板程式碼,使程式碼更加簡潔清晰。
比如對於簡單的 Java 物件(POJO),很多的程式碼裡充斥著大量的 getter()
和 setter()
方法,樣板程式碼佔用比例高,影響可讀性,引入 Lombok 只需一個註解就能達到相同效果,而且更簡潔。
Lombok 引入
使用 Lombok 註解需要依賴它的庫。
Maven 庫:https://mvnrepository.com/artifact/org.projectlombok/lombok
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency>
系統中如果有引入無需重複引入。
為什麼裝外掛?
因為 Lombok 的引入後,java 檔案使用 javac 編譯成的位元組碼檔案中就會包含 getter 和 setter 函數,但是原始碼中找不到定義,IDE 會認為這是錯誤,因此需要安裝一個 Lombok 的外掛,方便本地 IDE 的研發工作。
IDEA 中安裝:
Settings->Plugins->輸入框輸入”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 找方法呼叫處也可以直接鎖定到欄位上,以前要點兩下才能看到欄位明細資訊,使用 Lombok 點一下就能達到效果。
@Data
這種大而全的方式覆蓋太多的簡化場景。常用註解:@Getter/@Setter: 作用類上,生成所有成員變數的getter/setter方法;作用於成員變數上,生成該成員變數的getter/setter方法。可以設定存取許可權及是否懶載入等。
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檢視中,可以看到已經生成了getter/setter等方法。
編譯後的程式碼如下:這也是傳統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:作用於類,覆蓋預設的toString()方法,可以通過of屬性限定顯示某些欄位,通過exclude屬性排除某些欄位。
@EqualsAndHashCode:作用於類,覆蓋預設的equals和hashCode
@NonNull:主要作用於成員變數和引數中,標識不能為空,否則丟擲空指標異常。
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:作用於類上,用於生成建構函式。有staticName、access等屬性。
staticName屬性一旦設定,將採用靜態方法的方式生成範例,access屬性可以限定存取許可權。
@NoArgsConstructor:生成無參構造器;
@RequiredArgsConstructor:生成包含final和@NonNull註解的成員變數的構造器;
@AllArgsConstructor:生成全參構造器。
編譯後結果:
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:作用於類上,將類轉變為建造者模式
@Log:作用於類上,生成紀錄檔變數。針對不同的紀錄檔實現產品,有不同的註解:
其他重要註解:
@Cleanup:自動關閉資源,針對實現了java.io.Closeable介面的物件有效,如:典型的IO流物件。
編譯後結果如下:
是不是簡潔了太多。
@SneakyThrows:可以對受檢異常進行捕捉並丟擲,可以改寫上述的main方法如下。
@Synchronized:作用於方法級別,可以替換synchronize關鍵字或lock鎖,用處不大。
Lombok 原理
自 JDK6 之後,javac 在執行的時候會呼叫實現了 JSR 269 API 的程式,這樣我們就可以對編譯器做一些增強,這時 javac
執行的過程如下:
Lombok 本質上就是一個實現了“JSR 269 API”的程式。在使用 javac
的過程中,它產生作用的具體流程如下:
javac
對原始碼進行分析,生成一棵抽象語法樹(AST)JSR 269 API
”的 Lombok
程式@Getter @Setter
註解所在類對應的語法樹(AST)getter()
和 setter()
方法定義的相應樹節點@Data
:相當於@Setter + Getter + @ToString + @EqualsAndHashCode
@NoArgsConstructor
:自動生成無引數建構函式。@AllArgsConstructor
:自動生成全引數建構函式。
三個常用註解~~~~
到此這篇關於IDEA 2022 中的Lombok 使用基礎教學的文章就介紹到這了,更多相關IDEA 2022 Lombok 使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45