1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        盤點Lombok的幾個騷操作,你絕對沒用過!

        共 6083字,需瀏覽 13分鐘

         ·

        2024-04-30 14:11

        ?? 歡迎加入小哈的星球 ,你將獲得: 專屬的項目實戰(zhàn) / Java 學(xué)習(xí)路線 / 一對一提問 / 學(xué)習(xí)打卡 /  贈書福利


        全棧前后端分離博客項目 2.0 版本完結(jié)啦, 演示鏈接http://116.62.199.48/ ,新項目正在醞釀中。全程手摸手,后端 + 前端全棧開發(fā),從 0 到 1 講解每個功能點開發(fā)步驟,1v1 答疑,直到項目上線。目前已更新了239小節(jié),累計38w+字,講解圖:1645張,還在持續(xù)爆肝中.. 后續(xù)還會上新更多項目,目標(biāo)是將Java領(lǐng)域典型的項目都整一波,如秒殺系統(tǒng), 在線商城, IM即時通訊,Spring Cloud Alibaba 等等,戳我加入學(xué)習(xí),已有1300+小伙伴加入(早鳥價超低)


        前言

        本文不討論對錯,只講騷操作。

        有的方法看看就好,知道可以這么用,但是否應(yīng)用到實際開發(fā)中,那就仁者見仁,智者見智了。

        一萬個讀者就會有一萬個哈姆雷特,希望這篇文章能夠給您帶來一些思考。

        耐心看完,你一定會有所收獲。

        @onX

        例如 onConstructor, oMethod, 和 onParam 允許你在生成的代碼中注入自定義的注解。一個常見的用例是結(jié)合 Spring 的 @Autowired

        在 Spring 的組件(如 @Service、@Controller@Component、@Repository 等)中使用 @RequiredArgsConstructor(onConstructor = @__(@Autowired)),可以讓 Lombok 在生成構(gòu)造函數(shù)時也加上 @Autowired 注解,這樣,Spring 就可以自動注入所需的依賴。

        例如下面這段代碼

        @Service
        @RequiredArgsConstructor(onConstructor = @__(@Autowired))
        public class MyService {
            private final AnotherService anotherService;
        }

        上述代碼片段使用 Lombok 和 Spring 注解,Lombok 會為其生成以下代碼

        @Service
        public class MyService {
            private final AnotherService anotherService;

            @Autowired
            public MyService(AnotherService anotherService) {
                this.anotherService = anotherService;
            }
        }

        從生成的代碼中可以看出:

        • MyService 生成了一個構(gòu)造函數(shù),該構(gòu)造函數(shù)接受一個 AnotherService 類型的參數(shù)。
        • 由于構(gòu)造函數(shù)上有 @Autowired 注解,Spring 會自動查找合適的 AnotherService bean 實例并注入到 MyService 中。

        這種方式結(jié)合了 Lombok 的自動代碼生成功能和 Spring 的依賴注入功能,使得代碼更為簡潔。

        但是,使用此技巧時要確保團隊成員都理解其背后的含義,以避免混淆。

        @Delegate

        @Delegate可以讓你的類使用其他類的方法,而不需要自己寫代碼。

        比如,你有一個類叫做A,它有一個方法叫做sayHello(),你想讓另一個類B也能用這個方法,那就可以在B類中加上一個A類型的字段,并在這個字段上加上@Delegate注解,這樣,B類就可以直接調(diào)用sayHello()方法,就像它是自己的方法一樣。看個例子:

        // 一個類,有一個方法
        public class A {
            public void sayHello() {
                System.out.println("Hello");
            }
        }

        // 一個類,委托了A類的方法
        public class B {
            @Delegate // 委托A類的方法
            private A a = new A();

            public static void main(String[] args) {
                B b = new B();
                b.sayHello(); // 調(diào)用A類的方法
            }
        }

        這樣寫最大的好處就是可以避免類的層次過深或者耦合過緊,提高代碼的可讀性和可維護性,各種繼承來繼承去是真的看得頭疼。

        @Cleanup

        @Cleanup可以自動管理輸入輸出流等各種需要釋放的資源,確保安全地調(diào)用close方法。

        它的使用方法是在聲明的資源前加上@Cleanup,例如:

        @Cleanup InputStream in = new FileInputStream("some/file");

        這樣,當(dāng)你的代碼執(zhí)行完畢后,Lombok會自動在一個try-finally塊中調(diào)用in.close()方法,釋放資源。

        如果要釋放資源的方法名不是close,也可以指定要調(diào)用的方法名,例如:

        @Cleanup("release") MyResource resource = new MyResource();

        Lombok會自動在try-finally塊中調(diào)用resource.release()方法,釋放資源。

        可以看到,這比手動寫try-finally要簡潔得太多了,只要使用@Cleanup就能管理任何有無參方法的資源,指定正確的方法名即可。

        @Singular和 @Builder 組合

        @Builder讓你的類支持鏈?zhǔn)綐?gòu)造,而@Singular讓集合類型字段可以更方便的維護。

        @Singular注解可以用在集合類型的字段上,它會生成兩個方法,一個是添加單個元素的方法,一個是添加整個集合的方法。這兩個方法可以和 @Builder 生成的其他方法一起鏈?zhǔn)秸{(diào)用,給你的類的所有字段賦值。

        這么講可能有點懵,直接看示例:

        @Data
        @Builder
        public class User {
            private String name;
            private int age;
            @Singular
            private List<String> hobbies;
        }

        // 使用 @Builder 和 @Singular 生成的方法
        User user = User.builder()
            .name("練習(xí)時長兩年半")
            .age(28)
            .hobby("籃球") // 添加單個元素
            .hobby("唱歌") // 添加單個元素
            .hobbies(Arrays.asList("跳舞""其他")) // 添加整個集合
            .build(); // 構(gòu)造 User 對象

        可以看出,使用 @Singular 注解的好處是,你可以靈活地添加集合類型的字段,而不需要自己創(chuàng)建和初始化集合對象。

        另外,使用 @Singular 注解生成的集合字段,在調(diào)用 build() 方法后,會被轉(zhuǎn)換為不可變的集合,這樣可以保證對象的不變性和線程安全性。你也可以使用 clear() 方法來清空集合字段,例如:

        User user = User.builder()
            .name("簽")
            .age(28)
            .hobby("說唱")
            .hobby("跳舞")
            .clearHobbies() // 清空集合字段
            .hobby("踩縫紉機") // 重新添加元素
            .build();

        但需要注意的是,如果你的類繼承了一個父類,那么 @Builder 只會生成當(dāng)前類的字段和參數(shù),不包括父類的。

        @With

        允許你創(chuàng)建一個新的對象,該對象是當(dāng)前對象的副本,但某些字段的值已被更改。

        @With  
        public class Person {  
            private String name;  
            private int age;  
        }  
          
        Person person = new Person("Alice", 30);  
        // 創(chuàng)建一個新的 Person 對象,其 name 為 "Alice",但 age 為 31
        Person updatedPerson = person.withAge(31); 

        結(jié)尾

        請注意,盡管 Lombok 提供了許多方便的功能,但過度使用不當(dāng)使用可能會導(dǎo)致代碼難以理解和維護。

        因此,在使用這些功能時,務(wù)必始終保持審慎,并且要充分考慮其影響。

        ?? 歡迎加入小哈的星球 ,你將獲得: 專屬的項目實戰(zhàn) / Java 學(xué)習(xí)路線 / 一對一提問 / 學(xué)習(xí)打卡 /  贈書福利


        全棧前后端分離博客項目 2.0 版本完結(jié)啦, 演示鏈接http://116.62.199.48/ ,新項目正在醞釀中。全程手摸手,后端 + 前端全棧開發(fā),從 0 到 1 講解每個功能點開發(fā)步驟,1v1 答疑,直到項目上線。目前已更新了239小節(jié),累計38w+字,講解圖:1645張,還在持續(xù)爆肝中.. 后續(xù)還會上新更多項目,目標(biāo)是將Java領(lǐng)域典型的項目都整一波,如秒殺系統(tǒng), 在線商城, IM即時通訊,Spring Cloud Alibaba 等等,戳我加入學(xué)習(xí),已有1300+小伙伴加入(早鳥價超低)



             
                

        1. 我的私密學(xué)習(xí)小圈子~

        2. git提交錯了?別慌,直接刪除提交記錄

        3. BigDecimal 為什么可以保證精度不丟失?

        4. 大廠都在用的 Git 代碼管理規(guī)范 !

        最近面試BAT,整理一份面試資料Java面試BATJ通關(guān)手冊,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

        獲取方式:點“在看”,關(guān)注公眾號并回復(fù) Java 領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

        PS:因公眾號平臺更改了推送規(guī)則,如果不想錯過內(nèi)容,記得讀完點一下在看,加個星標(biāo),這樣每次新文章推送才會第一時間出現(xiàn)在你的訂閱列表里。

        “在看”支持小哈呀,謝謝啦

        瀏覽 172
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

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

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            黄片亚洲 | 男女做爰猛烈啪啪吃奶动床戏麻豆 | 2025成人免费毛片视频 | 天堂资源中文在线 | 啪一啪撸一撸 | 国产丰满果冻VⅰdeOSSeX | 日韩黄色电影网 | 国产精品jizz在线观看麻豆 | 精品一区二区三区免费毛片 | 精品视频一区二区三区四区乐趣播 |