<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用好這個 IDEA 插件,寫代碼效率至少提升 5 倍!

          共 5632字,需瀏覽 12分鐘

           ·

          2021-09-13 07:24

          關注Java核心技術,推送更多 Java 干貨!5f6db6d292aff1ec4aa25918a0806da6.webp

          還在編寫無聊枯燥又難以維護的POJO嗎?潔癖者的春天在哪里?請看Lombok!

          在過往的Java項目中,充斥著太多不友好的代碼:POJO的getter/setter/toString;異常處理;I/O流的關閉操作等等,這些樣板代碼既沒有技術含量,又影響著代碼的美觀,Lombok應運而生。

          首先說明一下:任何技術的出現(xiàn)都是為了解決某一類問題的,如果在此基礎上再建立奇技淫巧,不如回歸Java本身。應該保持合理使用而不濫用。

          Lombok的使用非常簡單,下面我們一起來看下:

          1)引入相應的maven包:

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

          Lombok的scope=provided,說明它只在編譯階段生效,不需要打入包中。事實正是如此,Lombok在編譯期將帶Lombok注解的Java文件正確編譯為完整的Class文件。

          2)添加IDE工具對Lombok的支持:

          IDEA中引入Lombok支持如下:

          點擊File-- Settings設置界面,安裝Lombok插件:

          1af8d561423cafa8d6598f12bde39ab8.webp

          點擊File-- Settings設置界面,開啟Annocation Processors:

          8e58a0da47a6ed7e673adf3a6d26652e.webp

          開啟該項是為了讓Lombok注解在編譯階段起到作用。

          Eclipse的Lombok插件安裝可以自行百度,也比較簡單,值得一提的是,由于Eclipse內置的編譯器不是Oracle javac,而是eclipse自己實現(xiàn)的Eclipse Compiler for Java (ECJ).要讓ECJ支持Lombok,需要在eclipse.ini配置文件中添加如下兩項內容:

          -Xbootclasspath/a:[lombok.jar所在路徑]

          -javaagent:[lombok.jar所在路徑]

          3)Lombok實現(xiàn)原理:

          自從Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”規(guī)范,只要程序實現(xiàn)了該API,就能在javac運行的時候得到調用。

          Lombok就是一個實現(xiàn)了"JSR 269 API"的程序。在使用javac的過程中,它產生作用的具體流程如下:

          4) Lombok注解的使用:

          POJO類常用注解:

          @Getter/@Setter: 作用類上,生成所有成員變量的getter/setter方法;作用于成員變量上,生成該成員變量的getter/setter方法。可以設定訪問權限及是否懶加載等。

          package?com.trace;

          import?lombok.AccessLevel;
          import?lombok.Getter;
          import?lombok.Setter;

          /**
          ?*?Created?by?Trace?on?2018/5/19.<br/>
          ?*?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等方法:

          1a6f17359c1861faf4277e2ac36efeda.webp

          編譯后的代碼如下:[這也是傳統(tǒng)Java編程需要編寫的樣板代碼]

          關注Java核心技術,推送更多 Java 干貨!5f6db6d292aff1ec4aa25918a0806da6.webp

          //
          //?Source?code?recreated?from?a?.class?file?by?IntelliJ?IDEA
          //?(powered?by?Fernflower?decompiler)
          //

          package?com.trace;

          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屬性排除某些字段。

          cb1fb770b4f91126a9ca4a38dbce1c9d.webp

          @EqualsAndHashCode: 作用于類,覆蓋默認的equals和hashCode

          @NonNull: 主要作用于成員變量和參數(shù)中,標識不能為空,否則拋出空指針異常。

          9341c6fe2ca68dbe390e3d0eb922f130.webp

          @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor: 作用于類上,用于生成構造函數(shù)。有staticName、access等屬性。

          staticName屬性一旦設定,將采用靜態(tài)方法的方式生成實例,access屬性可以限定訪問權限。

          @NoArgsConstructor:生成無參構造器;

          @RequiredArgsConstructor:生成包含final和@NonNull注解的成員變量的構造器;

          @AllArgsConstructor:生成全參構造器。

          cccd70a82161f308bb83170467c187c3.webp

          編譯后結果:

          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: 作用于類上,將類轉變?yōu)榻ㄔ煺吣J?/span>

          @Log: 作用于類上,生成日志變量。針對不同的日志實現(xiàn)產品,有不同的注解:

          556411103cb788d9701eac5bded02b47.webp

          其他重要注解:

          @Cleanup: 自動關閉資源,針對實現(xiàn)了java.io.Closeable接口的對象有效,如:典型的IO流對象

          34bd80d874433fe83d16fd545b30dddf.webp

          編譯后結果如下:

          f01b50e21cf46babbc7cff9fa2a151fb.webp

          是不是簡潔了太多。

          @SneakyThrows: 可以對受檢異常進行捕捉并拋出,可以改寫上述的main方法如下:

          c3a7da269a3f36db887be7bb1a6646a7.webp

          @Synchronized: 作用于方法級別,可以替換synchronize關鍵字或lock鎖,用處不大。

          作者:LiWenD正在掘金
          鏈接:https://juejin.cn/post/6844903607985242120

          最近好文分享1、最新 Java 面試題出爐!(帶全部答案)

          2、Java 8 中的 Optional 真的很強大

          3、Java 序列化的 3 個刁鉆問題!

          4、必會的工具庫,讓你的代碼量減少90%...

          5、Java 線程池,這篇,能讓你搞定面試官!

          更多請關注???Java核心技術

          一個分享Java核心技術干貨的公眾號

          點擊閱讀原文獲取面試題~
          瀏覽 132
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色黄片在线免费观看 | 91AV一区二区三区 | 国庄三级HD中文久久精品 | 无码窝在线观看 | 在线第一页 |