答應我,試試IDEA的這款插件,不要在代碼中出現大量的set/get方法了...

2022-01-06 Java面試那些事兒

# 前言

what?你的 Java 代碼中還充斥著大量的 set/get 方法?

我們在剛開始學習 Java 語言的時候講過,面向對象的三大特徵就是封裝,繼承,和多態。在 Java 中,要保證封裝性,需要將成員變量私有化,對外提供 set/get 方法來訪問,雖然現在的 IDE,像 eclipse,IDEA都提供了快捷鍵,來生成 set/get 方法,但是在做項目的時候,一個 JavaBean 往往會有很多的成員變量,一個變量對應兩個方法,如果有10幾個成員變量,那麼會對應20多個方法,也許還要去寫構造器、equals 等方法,而且需要維護。這樣一來,會使代碼變得非常冗餘,這些顯得很冗長也沒有太多技術含量,一旦修改屬性,就容易出現忘記修改對應方法的失誤。

我在看大佬的項目的源碼的時候,看到他們的代碼中都沒有 set/get 方法,取而代之的是在 JavaBean 上標註的註解,我感到非常的好奇,原來他們是用了一種叫做 Lombok 的插件,便去詳細了解了這個插件。

# Lombok背景介紹

官方介紹如下:

Project Lombok makes java a spicier language by adding 'handlers' that know how to build and compile simple, boilerplate-free, not-quite-java code.

大致意思是 Lombok 通過增加一些「處理程序」,可以讓 Java 變得簡潔、快速。

# Lombok使用方法

Lombok 能通過註解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString 方法。出現的神奇就是在源碼中沒有 getter 和 setter 方法,但是在編譯生成的字節碼文件中有 getter 和 setter 方法。這樣就省去了手動重建這些代碼的麻煩,使代碼看起來更簡潔些。

Lombok 的使用跟引用 jar 包一樣,可以在官網(https://projectlombok.org/download)下載 jar 包,也可以使用 maven 添加依賴:

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

注意:

第一次使用 Lombok 插件需要做如下幾步配置

將 Lombok 插件安裝到 IDEA

file -> setting

選中 Plugins,搜索 Lombok,點擊 Install

選擇默認的編譯方式為 javac,因為 eclipse 是不支持 Lombok 的編譯方式的,javac 支持 Lombok 的編譯方式。

打開註解生成器 Enable annotation processing

再次注意:

IntelliJ IDEA 2019.2(也就是我用的版本)默認是不支持 Lombok 插件的,需要去

https://plugins.jetbrains.com/plugin/6317-lombok/versions

下載對應版本的插件,然後手動引入,在 IDEA 中選擇 File -> Setting -> plugins 找到 Install Plugin from Disk…(注意版本不同位置可能有所差異)

接下來我們來分析 Lombok 中註解的具體用法

@Data

@Data 註解在類上,會為類的所有屬性自動生成 setter/getter、equals、canEqual、hashCode、toString 方法,如為 final 屬性,則不會為該屬性生成 setter 方法。

比如我們寫一個學生類

@Datapublic class Student {    private String name;    private Integer age;    private Integer id;    private String major;}

這樣就可以調用 set/get 方法了。

@Getter/@Setter

如果覺得@Data 太過殘暴(因為@Data 集合了@ToString、@EqualsAndHashCode、@Getter/@Setter、@RequiredArgsConstructor 的所有特性)不夠精細,可以使用@Getter/@Setter 註解,此註解在屬性上,可以為相應的屬性自動生成 set/get 方法。

public class Student {    @Setter private String name;    private Integer age;    private Integer id;    private String major;
public static void main(String[] args) { Student stu = new Student(); stu.setName("Mr.ml"); }}

@NonNull

該註解用在屬性或構造器上,Lombok 會生成一個非空的聲明,可用於校驗參數,能幫助避免空指針。

public class Student {    @Setter private String name;    private Integer age;    private Integer id;    private String major;
public Student(@NonNull String name) { this.name = name; }}

@Cleanup

該註解能幫助我們自動調用 close() 方法,很大的簡化了代碼。

public class CleanupExample {  public static void main(String[] args) throws IOException {    @Cleanup InputStream in = new FileInputStream(args[0]);    @Cleanup OutputStream out = new FileOutputStream(args[1]);    byte[] b = new byte[10000];    while (true) {      int r = in.read(b);          if (r == -1) break;          out.write(b, 0, r);      }    }}

@EqualsAndHashCode

默認情況下,會使用所有非靜態(non-static)和非瞬態(non-transient)屬性來生成 equals 和 hashCode,也能通過 exclude 註解來排除一些屬性。

@EqualsAndHashCode(exclude={"id", "shape"})public class EqualsAndHashCodeExample {    private transient int transientVar = 10;    private String name;    private double score;    private Shape shape = new Square(5, 10);    private String[] tags;    private int id;
public String getName() { return this.name; }
@EqualsAndHashCode(callSuper=true) public static class Square extends Shape { private final int width, height;
public Square(int width, int height) { this.width = width; this.height = height; } }}

@ToString

類使用@ToString 註解,Lombok 會生成一個 toString() 方法,默認情況下,會輸出類名、所有屬性(會按照屬性定義順序),用逗號來分割。

通過將 includeFieldNames 參數設為 true,就能明確的輸出 toString() 屬性。這一點是不是有點繞口,通過代碼來看會更清晰些。

@ToString(exclude="id")public class ToStringExample {    private static final int STATIC_VAR = 10;    private String name;    private Shape shape = new Square(5, 10);    private String[] tags;    private int id;
public String getName() { return this.getName(); }
@ToString(callSuper=true, includeFieldNames=true) public static class Square extends Shape { private final int width, height;
public Square(int width, int height) { this.width = width; this.height = height; } }}

NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

無參構造器、部分參數構造器、全參構造器。Lombok沒法實現多種參數構造器的重載。

@RequiredArgsConstructor(staticName = "of")@AllArgsConstructor(access = AccessLevel.PROTECTED)public class ConstructorExample<T> {    private int x, y;    @NonNull private T description;
@NoArgsConstructor public static class NoArgsExample { @NonNull private String field; }}

作者:Mr.ml

來源:blog.csdn.net/MarcoAsensio/article/details/103654691



相關焦點

  • 寫代碼用這6款IDEA插件,讓你快到飛起!
    搞Java開發當然必用神器idea,那麼,idea的插件一定是你不可或缺的了。一方面可以提升自己的編碼效率,另一方面減輕工作時的苦悶煩躁。以下就為大家介紹幾款優秀的idea插件以及它們的使用方法。以下插件可以直接在 IDEA 插件管理裡面搜索安裝:1. Background Image Plus它是一個「換壁紙」插件。可以將編輯器背景隨意換為文件夾中的任何圖片。
  • CTO:不要在代碼中寫 set/get 方法了,逮一次罰款...
    你的 Java 代碼中還充斥著大量的 set/get 方法於是公司出了規定:不要在代碼中寫 set/get 方法了,逮一次罰款。剛開始學習 Java 語言的時候,面向對象的三大特徵就是封裝,繼承,和多態。
  • CTO:不要在 Java 代碼中寫 set/get 方法了,逮一次罰款500
    你的 Java 代碼中還充斥著大量的 set/get 方法?我們在剛開始學習 Java 語言的時候講過,面向對象的三大特徵就是封裝,繼承,和多態。在 Java 中,要保證封裝性,需要將成員變量私有化,對外提供 set/get 方法來訪問,雖然現在的 IDE,像 eclipse,IDEA都提供了快捷鍵,來生成 set/get 方法,但是在做項目的時候,一個 JavaBean 往往會有很多的成員變量,一個變量對應兩個方法,如果有10幾個成員變量,那麼會對應20多個方法,也許還要去寫構造器、equals 等方法,而且需要維護。
  • Java代碼中寫set/get方法了,逮到罰款!
    你的 Java 代碼中還充斥著大量的 set/get 方法?我們在剛開始學習 Java 語言的時候講過,面向對象的三大特徵就是封裝,繼承,和多態。在 Java 中,要保證封裝性,需要將成員變量私有化,對外提供 set/get 方法來訪問,雖然現在的 IDE,像 eclipse,IDEA都提供了快捷鍵,來生成 set/get 方法,但是在做項目的時候,一個 JavaBean 往往會有很多的成員變量,一個變量對應兩個方法,如果有10幾個成員變量,那麼會對應20多個方法,也許還要去寫構造器、equals 等方法,而且需要維護。
  • 優雅的寫一個JavaBean,免去生成get和set的終極解決方案
    開發中我們要寫大量的java實體類,雖然idea能夠直接生成get和set方法,有的時候碰到那種屬性很多的實體類,看代碼都看的頭痛。現在介紹一款好用的插件給各位小夥伴,它能夠讓代碼更簡潔好看,不需要生成get和set方法,編譯也能通過。
  • 【IDEA 系列】插件推薦
    詳細使用文檔,參考:https://www.jetbrains.com/help/idea/class-diagram.htmlgoogle-java-format/Alibaba Java Coding Guidelines代碼規範插件國內說阿里規範好,有些人說谷歌規範更好,隨便你們,二選其一。
  • IDEA 中的神奇插件:防沉迷、防猝死...
    所以我想究竟是我太賴了,還是用Idea寫代碼容易沉迷,總之不可能是改需求有意思。所以元旦節打算為自己開發一款小小的Idea防沉迷插件,我叫她StopCodin。她應該可以設置每隔多少分鐘,就彈出一個提醒對話框,一旦對話框彈出來,idea的代碼編輯框就自動失去了焦點,什麼都不能操作,到這還不算完,關鍵是這個對話框得關不了,並且還顯示著休息倒計時,還有即使我修改了系統時間,這個倒計時也依然有效,除非我打開任務管理器,關閉Idea的進程,然後再重新啟動Idea。但是想一下想,idea都都關了,還是休息一下吧。
  • 30 個 IDEA 插件,總有一款適合你!
    Lombok plugin有了這個插件就不用get set方法了使用方法:選中要變化的地方,使用快捷鍵Shift+Alt+U即可。9. Maven HelperMaven依賴分析等功能10.Key promoterKey promoter這款插件適合新手使用。當你點擊滑鼠一個功能的時候,可以提示你這個功能快捷鍵是什麼。
  • 匯總一下Intellij IDEA炫酷的插件
    戳藍字「java程序媛之家」關注我哦!喜歡的可以試試,讓編碼不再單調。火焰特效,抖動都可以單獨關閉。留下重力碎屑就好了7、快捷跳轉Action方法 RestfulToolkit推薦指數:☆☆☆☆☆推薦理由:spring的開發中經常有根據瀏覽器url找對應action方法的需求,這個可以快捷的根據url跳轉,不用findAll查詢了往日插件:
  • 21 款 yyds 的 IDEA插件,真香!
    這個是一款比較實用的插件。但是,現在需要收費啦,貌似是需要花費29塊錢,送兩個激活碼。不過,也可以申請7天的免費測試碼,體驗一下在購買也可以的。收費掩蓋不了她的魅力所在,這也是行業發展的趨勢。是一款比較常見的熱部署插件,一般用於Run模式下的自動編譯,破譯版本,具體請戳我    有一個好的編寫單元測試習慣的開發者,代碼質量肯定是很好的,可以隨時校驗自己開發和改寫接口的快速檢查工具。
  • 代碼神器:拒絕重複編碼,這款IDEA插件了解一下...
    作者:HeloWxl www.jianshu.com/p/e4192d7c6844  Easycode是idea的一個插件,可以直接對數據的表生成entity、controller、service、
  • 開發屬於自己的第一款IDEA插件!
    這樣在調試時,就可以調試IDEA自身的代碼了:第一個插件我們來編寫一個最簡單的插件來學習編寫一個插件的完整步驟。新建一個自定義的Action有兩個步驟:繼承AnAction類,在actionPerformed方法中實現插件邏輯
  • IDEA 防止寫代碼沉迷插件 !
    所以我想究竟是我太賴了,還是用 IDEA 寫代碼容易沉迷,總之不可能是改需求有意思。所以元旦節打算為自己開發一款小小的 IDEA 防沉迷插件,我叫她【StopCoding】。她應該可以設置每隔多少分鐘,就彈出一個提醒對話框,一旦對話框彈出來,IDEA 的代碼編輯框就自動失去了焦點,什麼都不能操作,到這還不算完,關鍵是這個對話框得關不了,並且還顯示著休息倒計時,還有即使我修改了系統時間,這個倒計時也依然有效,除非我打開任務管理器,關閉 IDEA 的進程,然後再重新啟動 IDEA。但是想一下想,IDEA 都都關了,還是休息一下吧。
  • 圈子哥把我的 IDEA 配置、插件發給大家
    Alt + enterIntelliJ IDEA 根據光標所在問題,提供快速修複選擇,光標放在的位置不同提示的結果也不同Alt + ↑/↓方法快速跳轉F2跳轉到下一個高亮錯誤 或 警告位置Alt + Insert代碼自動生成,如生成對象的 set / get
  • idea編寫Java代碼時中文字符實時替換為英文字符的多種方法
    大部分程式語言寫代碼的時候,不能出現中文標點符號,必須使用英文的標點符號,但是寫代碼的過程中,很多時候是需要寫中文注釋的,這樣來回切換輸入法呢,有點繁瑣,有時候不小心忘記切換,就寫錯了,有的編輯器比較智能,立馬就能檢測到,但有的文本編輯器並不能檢測到,會導致出現
  • 教你開發一款屬於自己的Android Studio插件
    本篇文章來自 寒雲清語 的投稿,和大家分享了如何開發一款Android Studio插件,希望對大家有所幫助!我們常用的的插件,比如說:GsonFormat、Android ButterKnife Zelezny、findBugs-IDEA、JsonOnlineViewer等等等,當然這不是我們今天要說的重點,今天的主題是,我們能不能自己開發一款能實現自己的需求的插件呢?答案當然是,可以的!IDEA的下載和安裝我們就不說了。直接去官網下載就可以了。
  • Java中的get()方法和set()方法
    在Java中,為了數據的安全
  • 那些總是寫「爛代碼」的程式設計師,強烈推薦使用這款 IntelliJ IDEA...
    一、目標idea集成sonar的代碼檢查,實現可以在提交代碼前就檢查你的代碼,而不是將代碼提交之後,之後再去檢查。Sonar可以從以下七個維度檢測代碼質量,而作為開發人員至少需要處理前5種代碼質量問題1.
  • 工具:IDEA常用插件分享(二)
    接下來要說的這個插件,不但支持結構體轉報文,還有一個非常好用的功能,我們知道通過Spring進行開發的worker們,一般都是在每一個文件中書寫請求調用的路徑,並且一個類可能包含一個公共路徑,和其他的方法路徑,真正的請求路徑是公共路徑和方法路徑拼接而成,那我們在搜索的時候,並沒辦法把公共路徑拼接,這就導致當多個方法上的路徑一樣的時候,查找變得麻煩。
  • java技能提升,用Lombok甩掉get和set,讓代碼變得更簡潔
    前言前幾天有個新來的同事(實習生)驚訝的對我說:我們的代碼裡好多錯誤,我的程序本地都啟動不了。我一臉懵逼的質問他:目前線上的代碼,怎麼會有問題嗎?他不服氣的說:你來看嘛,就是有問題,Dao實體get()和set()方法都沒有。此處省略10000字,讓我流一會兒技術人的眼淚。