亚洲国产日韩人妖另类,久久只有这里有精品热久久,依依成人精品视频在线观看,免费国产午夜视频在线

      
      

        lombok 插件使用時遇到的第2個坑

        為了更簡潔的構(gòu)造bean對象,使用注解@Builder,然而發(fā)現(xiàn),通過builder生成的bean對象,字段默認(rèn)值沒了(備注:日常開發(fā)中,bean 的成員變量盡量使用封裝對象,以及盡量不要有默認(rèn)值),但是通過new 得到的對象,字段默認(rèn)值存在。

        問題偽代碼如下:

        /** * @description: 用戶父類 * @author: lyl * @create: 2022-06-01 14:42:27 **/@Datapublic class UserParent { /** * id */ private String id;}@Data@Builder@NoArgsConstructor@AllArgsConstructorpublic class UserChildren extends UserParent{ /** * 姓名 */ private String name = “七夜”; /** * 年齡 */ private Integer age;}@SpringBootTestclass CodeTestApplicationTests {@Testvoid contextLoads() {UserChildren user1 = new UserChildren();System.out.println(user1);UserChildren user2 = UserChildren.builder().build();System.out.println(user2);}}執(zhí)行結(jié)果如下:UserChildren(name=七夜, age=null)UserChildren(name=null, age=null)

        針對lombok注解問題的排查,最簡單的方式就是直接查看編譯之后的代碼。反編譯后的UserCildren.class如下:

        //// Source code recreated from a .class file by IntelliJ IDEA// (powered by FernFlower decompiler)//package com.yalin.code.vo;public class UserChildren extends UserParent { private String name = “七夜”; private Integer age; public static UserChildrenBuilder builder() { return new UserChildrenBuilder(); } public String getName() { return this.name; } public Integer getAge() { return this.age; } public void setName(final String name) { this.name = name; } public void setAge(final Integer age) { this.age = age; } public boolean equals(final Object o) { if (o == this) { return true; } else if (!(o instanceof UserChildren)) { return false; } else { UserChildren other = (UserChildren)o; if (!other.canEqual(this)) { return false; } else { Object this$age = this.getAge(); Object other$age = other.getAge(); if (this$age == null) { if (other$age != null) { return false; } } else if (!this$age.equals(other$age)) { return false; } Object this$name = this.getName(); Object other$name = other.getName(); if (this$name == null) { if (other$name != null) { return false; } } else if (!this$name.equals(other$name)) { return false; } return true; } } } protected boolean canEqual(final Object other) { return other instanceof UserChildren; } public int hashCode() { int PRIME = true; int result = 1; Object $age = this.getAge(); result = result * 59 + ($age == null ? 43 : $age.hashCode()); Object $name = this.getName(); result = result * 59 + ($name == null ? 43 : $name.hashCode()); return result; } public String toString() { String var10000 = this.getName(); return “UserChildren(name=” + var10000 + “, age=” + this.getAge() + “)”; } public UserChildren() { } public UserChildren(final String name, final Integer age) { this.name = name; this.age = age; } public static class UserChildrenBuilder { private String name; private Integer age; UserChildrenBuilder() { } public UserChildrenBuilder name(final String name) { this.name = name; return this; } public UserChildrenBuilder age(final Integer age) { this.age = age; return this; } public UserChildren build() { return new UserChildren(this.name, this.age); } public String toString() { return “UserChildren.UserChildrenBuilder(name=” + this.name + “, age=” + this.age + “)”; } }}

        通過查看編譯之后的代碼,可以看到,使用@Builder注解之后,lombok會生成一個UserChildrenBuilder的靜態(tài)內(nèi)部類,這個類包含了UserChildren的成員變量,但是包含的成員變量中,name字段的初始值沒了,當(dāng)我們使用UserChildren.builder().build()來構(gòu)造bean時,代碼內(nèi)部先生成一個UserChildrenBuilder的對象,然后對這個對象進(jìn)行賦值,最后調(diào)用UserChildren的全參構(gòu)造函數(shù),生成UserChildren對象。就像一個代理一樣!

        因此:

        使用new 對象時,沒有使用到UserChildrenBuilder,因此name字段的初始值保留了。

        使用builder構(gòu)造對象時,UserChildrenBuilder的name字段沒有了初始值,生成的對象,name字段自然就沒值了。

        鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
        上一篇 2022年6月12日 14:30
        下一篇 2022年6月12日 14:31

        相關(guān)推薦

        聯(lián)系我們

        聯(lián)系郵箱:admin#wlmqw.com
        工作時間:周一至周五,10:30-18:30,節(jié)假日休息