[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"primary-menu":6,"cat-lombok":85,"catposts-lombok":97,"post-detail-post-lombok-data-3de3dc8b":407},{"config":4,"socialLinks":5},null,[],{"metadata":7,"spec":10,"menuItems":20},{"name":8,"creationTimestamp":9},"primary","2026-09-12T06:13:55.024154Z",{"displayName":11,"menuItems":12},"主菜单",[13,14,15,16,17,18,19],"88c3f10b-321c-4092-86a8-70db00251b74","menu-item-izrtmxer","c4c814d1-0c2c-456b-8c96-4864965fee94","menu-item-column","menu-item-tools","menu-item-zsxq","menu-item-ocrxlczu",[21,30,40,49,58,67,76],{"displayName":22,"metadata":23,"spec":25,"status":28,"children":29},"首页",{"name":13,"creationTimestamp":24},"2026-09-12T06:13:54.422830Z",{"displayName":22,"href":26,"priority":27,"menuName":8},"\u002F",0,{"displayName":22,"href":26},[],{"displayName":31,"metadata":32,"spec":34,"status":38,"children":39},"Java面试八股",{"name":14,"creationTimestamp":33},"2026-09-13T09:42:02.854891Z",{"displayName":31,"href":35,"target":36,"priority":37,"menuName":8},"\u002Fjava-interview","_self",1,{"displayName":31,"href":35},[],{"displayName":41,"metadata":42,"spec":44,"status":47,"children":48},"文章",{"name":15,"creationTimestamp":43},"2026-09-12T06:13:54.457307Z",{"displayName":41,"href":45,"priority":46,"menuName":8},"\u002Farchives",2,{"displayName":41,"href":45},[],{"displayName":50,"metadata":51,"spec":53,"status":56,"children":57},"项目实战",{"name":16,"creationTimestamp":52},"2026-09-14T00:35:08.138170Z",{"displayName":50,"href":54,"target":36,"priority":55,"menuName":8},"\u002Fcolumn",3,{"displayName":50,"href":54},[],{"displayName":59,"metadata":60,"spec":62,"status":65,"children":66},"在线工具",{"name":17,"creationTimestamp":61},"2026-09-14T00:35:08.171474Z",{"displayName":59,"href":63,"target":36,"priority":64,"menuName":8},"\u002Ftools",4,{"displayName":59,"href":63},[],{"displayName":68,"metadata":69,"spec":71,"status":74,"children":75},"知识星球",{"name":18,"creationTimestamp":70},"2026-09-14T00:35:08.199145Z",{"displayName":68,"href":72,"target":36,"priority":73,"menuName":8},"\u002Fzsxq",5,{"displayName":68,"href":72},[],{"displayName":77,"metadata":78,"spec":80,"status":83,"children":84},"特价云服务器",{"name":19,"creationTimestamp":79},"2026-09-25T15:30:59.201614Z",{"displayName":77,"href":81,"target":36,"priority":82,"menuName":8},"\u002Fserver",6,{"displayName":77,"href":81},[],{"metadata":86,"spec":89,"status":94,"postCount":96},{"name":87,"creationTimestamp":88},"lombok","2026-09-12T08:22:44.622640Z",{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},"Lombok 使用教程","\u002Fupload\u002Ftutorial-cover-lombok.png","Lombok 使用教程：常用注解与底层原理、IDEA 配置、序列化坑与团队使用规范。",false,{"permalink":95,"postCount":96,"visiblePostCount":96},"\u002Fcategories\u002Flombok",15,[98,122,143,164,184,204,224,244,264,284,305,325,345,366,387],{"metadata":99,"spec":102,"status":113,"categories":117},{"name":100,"creationTimestamp":101},"post-what-is-lombok-eacf45e9","2026-09-12T08:29:54.692339Z",{"title":103,"slug":104,"cover":105,"excerpt":106,"publishTime":108,"categories":109,"tags":110,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok 主要作用是什么？它是干嘛的？","what-is-lombok","\u002Fupload\u002F169059305581280-yJax.jpg",{"raw":107,"autoGenerate":93},"Lombok 是一个超酷的 Java 库，它能让你的 Java 代码变得简洁、高效，还能帮你省去很多繁琐的工作，堪称偷懒神器，企业级开发必备。","2026-09-12T08:29:54.750221Z",[87],[],"PUBLIC",true,{"permalink":114,"excerpt":107,"lastModifyTime":115,"phase":116},"\u002Farchives\u002Fwhat-is-lombok","2026-09-13T05:25:35.579934Z","PUBLISHED",[118],{"metadata":119,"spec":120,"status":121,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":123,"spec":126,"status":135,"categories":138},{"name":124,"creationTimestamp":125},"post-sneaky-throws-c1701b9c","2026-09-12T08:29:53.976459Z",{"title":127,"slug":128,"cover":129,"excerpt":130,"publishTime":132,"categories":133,"tags":134,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok @SneakyThrows 注解：简化异常操作","sneaky-throws","\u002Fupload\u002F173086350546415-rRmm.jpg",{"raw":131,"autoGenerate":93},"@SneakyThrows 用来偷偷地抛出检查型异常（checked exception），而无需显式地在方法签名中声明 throws 或者使用 try-catch。对于需要捕获或声明的异常，@SneakyThrows 注解可以让方法绕过这一步。","2026-09-12T08:29:54.036824Z",[87],[],{"permalink":136,"excerpt":131,"lastModifyTime":137,"phase":116},"\u002Farchives\u002Fsneaky-throws","2026-09-13T05:25:37.067969Z",[139],{"metadata":140,"spec":141,"status":142,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":144,"spec":147,"status":156,"categories":159},{"name":145,"creationTimestamp":146},"post-lombok-value-e86c89a7","2026-09-12T08:29:53.354870Z",{"title":148,"slug":149,"cover":150,"excerpt":151,"publishTime":153,"categories":154,"tags":155,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok @Value 注解：创建不可变类","lombok-value","",{"raw":152,"autoGenerate":93},"Lombok 的 @Value 注解用于简化不可变对象的创建。不可变对象（Immutable Object）在创建后，其内部状态无法改变，具备线程安全的特性，适合并发环境中共享数据的场景。","2026-09-12T08:29:53.417301Z",[87],[],{"permalink":157,"excerpt":152,"lastModifyTime":158,"phase":116},"\u002Farchives\u002Flombok-value","2026-09-12T08:29:53.359551Z",[160],{"metadata":161,"spec":162,"status":163,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":165,"spec":168,"status":176,"categories":179},{"name":166,"creationTimestamp":167},"post-lombok-to-string-c4811b47","2026-09-12T08:29:52.773514Z",{"title":169,"slug":170,"cover":150,"excerpt":171,"publishTime":173,"categories":174,"tags":175,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok @ToString 注解：快速打印对象内容","lombok-to-string",{"raw":172,"autoGenerate":93},"Lombok 的 @ToString 注解用于自动生成 toString() 方法，帮助快速打印对象的内容，以便调试或日志记录。默认情况下，`@ToString` 会将类中所有非静态字段包含在 toString() 方法中，并按字段声明的顺序显示字段值。","2026-09-12T08:29:52.835200Z",[87],[],{"permalink":177,"excerpt":172,"lastModifyTime":178,"phase":116},"\u002Farchives\u002Flombok-to-string","2026-09-12T08:29:52.776682Z",[180],{"metadata":181,"spec":182,"status":183,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":185,"spec":188,"status":196,"categories":199},{"name":186,"creationTimestamp":187},"post-lombok-principle-d40a8209","2026-09-12T08:29:52.089871Z",{"title":189,"slug":190,"cover":150,"excerpt":191,"publishTime":193,"categories":194,"tags":195,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok 实现原理是什么？","lombok-principle",{"raw":192,"autoGenerate":93},"Lombok 的核心是利用 Java 注解处理器 和 AST（抽象语法树）修改 技术，在编译阶段动态插入代码。","2026-09-12T08:29:52.164133Z",[87],[],{"permalink":197,"excerpt":192,"lastModifyTime":198,"phase":116},"\u002Farchives\u002Flombok-principle","2026-09-12T08:29:52.096242Z",[200],{"metadata":201,"spec":202,"status":203,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":205,"spec":208,"status":216,"categories":219},{"name":206,"creationTimestamp":207},"post-lombok-log-7cf20461","2026-09-12T08:29:51.501796Z",{"title":209,"slug":210,"cover":150,"excerpt":211,"publishTime":213,"categories":214,"tags":215,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok @Log 系列注解: 简化日志记录","lombok-log",{"raw":212,"autoGenerate":93},"Lombok 提供了一系列 @Log 注解，用于自动生成日志记录器实例，简化 Java 类中日志的定义和使用。这些注解支持常见的日志框架，比如 java.util.logging、Log4j、Log4j2、Slf4j 等。","2026-09-12T08:29:51.557453Z",[87],[],{"permalink":217,"excerpt":212,"lastModifyTime":218,"phase":116},"\u002Farchives\u002Flombok-log","2026-09-12T08:29:51.504532Z",[220],{"metadata":221,"spec":222,"status":223,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":225,"spec":228,"status":236,"categories":239},{"name":226,"creationTimestamp":227},"post-lombok-getter-setter-c542a7fe","2026-09-12T08:29:50.887267Z",{"title":229,"slug":230,"cover":150,"excerpt":231,"publishTime":233,"categories":234,"tags":235,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok @Getter @Setter 注解: 简化属性操作","lombok-getter-setter",{"raw":232,"autoGenerate":93},"Lombok 提供的 @Getter 和 @Setter 注解是最常用的注解之一，主要用于自动生成类的 getter 和 setter 方法。这些方法可以大大减少手动编写代码的工作量，让代码更简洁、更易读。","2026-09-12T08:29:50.940298Z",[87],[],{"permalink":237,"excerpt":232,"lastModifyTime":238,"phase":116},"\u002Farchives\u002Flombok-getter-setter","2026-09-12T08:29:50.890512Z",[240],{"metadata":241,"spec":242,"status":243,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":245,"spec":248,"status":256,"categories":259},{"name":246,"creationTimestamp":247},"post-lombok-equals-and-hash-code-a3d03899","2026-09-12T08:29:50.011368Z",{"title":249,"slug":250,"cover":150,"excerpt":251,"publishTime":253,"categories":254,"tags":255,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok @EqualsAndHashCode 注解：简化对象比较","lombok-equals-and-hash-code",{"raw":252,"autoGenerate":93},"Lombok 的 @EqualsAndHashCode 注解用于自动生成 equals() 和 hashCode() 方法，这两个方法对于对象比较和在集合中的使用非常重要。equals() 方法决定了对象的比较方式，而 hashCode() 则影响对象在散列集合（如 HashSet 和 HashMap）中的表现。","2026-09-12T08:29:50.233386Z",[87],[],{"permalink":257,"excerpt":252,"lastModifyTime":258,"phase":116},"\u002Farchives\u002Flombok-equals-and-hash-code","2026-09-12T08:29:50.014186Z",[260],{"metadata":261,"spec":262,"status":263,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":265,"spec":268,"status":276,"categories":279},{"name":266,"creationTimestamp":267},"post-lombok-dependency-install-afb949d3","2026-09-12T08:29:49.422864Z",{"title":269,"slug":270,"cover":150,"excerpt":271,"publishTime":273,"categories":274,"tags":275,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok 依赖安装","lombok-dependency-install",{"raw":272,"autoGenerate":93},"想要在项目中使用 Lombok, 首先, 你需要在项目中添加 Lombok 依赖。本小节中，我将分别演示如何在项目构建工具（ Maven 或 Gradle ）中添加 Lombok 依赖。","2026-09-12T08:29:49.475556Z",[87],[],{"permalink":277,"excerpt":272,"lastModifyTime":278,"phase":116},"\u002Farchives\u002Flombok-dependency-install","2026-09-12T08:29:49.425988Z",[280],{"metadata":281,"spec":282,"status":283,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":285,"spec":288,"status":297,"categories":300},{"name":286,"creationTimestamp":287},"post-lombok-data-3de3dc8b","2026-09-12T08:29:48.783849Z",{"title":289,"slug":290,"cover":291,"excerpt":292,"publishTime":294,"categories":295,"tags":296,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok @Data 注解：快速生成类常用方法","lombok-data","\u002Fupload\u002F167575545480437-ebty.jpg",{"raw":293,"autoGenerate":93},"在 Lombok 中，@Data 是个万金油注解。一个 @Data 注解相当于同时使用了 @Getter 、@Setter 、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode...","2026-09-12T08:29:48.870613Z",[87],[],{"permalink":298,"excerpt":293,"lastModifyTime":299,"phase":116},"\u002Farchives\u002Flombok-data","2026-09-13T05:25:38.689202Z",[301],{"metadata":302,"spec":303,"status":304,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":306,"spec":309,"status":317,"categories":320},{"name":307,"creationTimestamp":308},"post-lombok-builder-0339d5b6","2026-09-12T08:29:48.038614Z",{"title":310,"slug":311,"cover":150,"excerpt":312,"publishTime":314,"categories":315,"tags":316,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok @Builder 注解：流畅的构建者模式","lombok-builder",{"raw":313,"autoGenerate":93},"Lombok 的 @Builder 注解用于生成建造者（Builder）模式的代码。Builder 模式提供了一种灵活、易读的方式来创建复杂对象，尤其适合需要设置多个可选参数、支持链式调用的场景。@Builder 注解自动生成了静态内部类 Builder 及其相关方法，使代码更加简洁、清晰。","2026-09-12T08:29:48.096644Z",[87],[],{"permalink":318,"excerpt":313,"lastModifyTime":319,"phase":116},"\u002Farchives\u002Flombok-builder","2026-09-12T08:29:48.041679Z",[321],{"metadata":322,"spec":323,"status":324,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":326,"spec":329,"status":337,"categories":340},{"name":327,"creationTimestamp":328},"post-lombok-args-constructor-49c212ca","2026-09-12T08:29:47.407172Z",{"title":330,"slug":331,"cover":150,"excerpt":332,"publishTime":334,"categories":335,"tags":336,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Lombok @Constructor 系列注解：轻松生成类的构造方法","lombok-args-constructor",{"raw":333,"autoGenerate":93},"Lombok 提供了一系列构造器注解，帮助开发者轻松生成构造方法。主要包括 @NoArgsConstructor、@AllArgsConstructor 和 @RequiredArgsConstructor，可以根据需要自动生成无参、全参或指定参数的构造器。","2026-09-12T08:29:47.462011Z",[87],[],{"permalink":338,"excerpt":333,"lastModifyTime":339,"phase":116},"\u002Farchives\u002Flombok-args-constructor","2026-09-12T08:29:47.410413Z",[341],{"metadata":342,"spec":343,"status":344,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":346,"spec":349,"status":358,"categories":361},{"name":347,"creationTimestamp":348},"post-idea-install-lombok-plugin-2e5a8631","2026-09-12T08:29:46.815062Z",{"title":350,"slug":351,"cover":352,"excerpt":353,"publishTime":355,"categories":356,"tags":357,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"IDEA 安装 Lombok 插件（图文教程）","idea-install-lombok-plugin","\u002Fupload\u002F169059578851069-SiKa.jpg",{"raw":354,"autoGenerate":93},"本小节中，我将通图文的方式，手把手演示如何在 IDEA 中安装 Lombok 插件。","2026-09-12T08:29:46.862690Z",[87],[],{"permalink":359,"excerpt":354,"lastModifyTime":360,"phase":116},"\u002Farchives\u002Fidea-install-lombok-plugin","2026-09-13T05:25:39.275975Z",[362],{"metadata":363,"spec":364,"status":365,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":367,"spec":370,"status":379,"categories":382},{"name":368,"creationTimestamp":369},"post-eclipse-install-lombok-plugin-27c19d60","2026-09-12T08:29:46.234176Z",{"title":371,"slug":372,"cover":373,"excerpt":374,"publishTime":376,"categories":377,"tags":378,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"Eclipse 安装 Lombok 插件（图文教程）","eclipse-install-lombok-plugin","\u002Fupload\u002F169060085073147-QlhP.jpg",{"raw":375,"autoGenerate":93},"本小节中，我们将通过图文的方式，手把手教你如何在 Eclipse 中安装 Lombok 插件。","2026-09-12T08:29:46.288767Z",[87],[],{"permalink":380,"excerpt":375,"lastModifyTime":381,"phase":116},"\u002Farchives\u002Feclipse-install-lombok-plugin","2026-09-13T05:25:42.436373Z",[383],{"metadata":384,"spec":385,"status":386,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":388,"spec":391,"status":399,"categories":402},{"name":389,"creationTimestamp":390},"post-avoid-lombok-pitfalls-0979c95e","2026-09-12T08:29:45.645846Z",{"title":392,"slug":393,"cover":150,"excerpt":394,"publishTime":396,"categories":397,"tags":398,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},"如何避免 Lombok 的常见陷阱？","avoid-lombok-pitfalls",{"raw":395,"autoGenerate":93},"尽管 Lombok 是一个强大的工具，可以帮助我们简化代码，提高开发效率，但是如果不恰当地使用，也可能会引入一些问题。本文将为你详述如何避免 Lombok 的常见陷阱。","2026-09-12T08:29:45.700024Z",[87],[],{"permalink":400,"excerpt":395,"lastModifyTime":401,"phase":116},"\u002Farchives\u002Favoid-lombok-pitfalls","2026-09-12T08:29:45.649699Z",[403],{"metadata":404,"spec":405,"status":406,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"metadata":408,"spec":409,"status":413,"categories":414,"content":419},{"name":286,"creationTimestamp":287},{"title":289,"slug":290,"cover":291,"excerpt":410,"publishTime":294,"categories":411,"tags":412,"priority":27,"pinned":93,"deleted":93,"visible":111,"allowComment":112},{"raw":293,"autoGenerate":93},[87],[],{"permalink":298,"excerpt":293,"lastModifyTime":299,"phase":116},[415],{"metadata":416,"spec":417,"status":418,"postCount":96},{"name":87,"creationTimestamp":88},{"displayName":90,"slug":87,"cover":91,"description":92,"priority":27,"hideFromList":93,"preventParentPostCascadeQuery":93},{"permalink":95,"postCount":96,"visiblePostCount":96},{"content":420,"raw":420},"\u003Cp>在 Lombok 中，\u003Ccode>@Data\u003C\u002Fcode> 是一个\u003Cstrong>集合注解\u003C\u002Fstrong>，它整合了多个 Lombok 注解，用于快速生成实体类对象所需的常用方法。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>一个 \u003Ccode>@Data\u003C\u002Fcode> 注解相当于同时使用了如下注解 ：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ccode>@Getter\u003C\u002Fcode> 和 \u003Ccode>@Setter\u003C\u002Fcode>：为每个字段生成 \u003Ccode>getter\u003C\u002Fcode> 和 \u003Ccode>setter\u003C\u002Fcode> 方法；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>@ToString\u003C\u002Fcode>：生成 \u003Ccode>toString()\u003C\u002Fcode> 方法，打印对象的所有字段；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>@EqualsAndHashCode\u003C\u002Fcode>：生成 \u003Ccode>equals()\u003C\u002Fcode> 和 \u003Ccode>hashCode()\u003C\u002Fcode> 方法，基于字段值实现对象比较；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>@RequiredArgsConstructor\u003C\u002Fcode>：生成包含 \u003Ccode>final\u003C\u002Fcode> 和 \u003Ccode>@NonNull\u003C\u002Fcode> 字段的构造方法；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\n\u003Cimg src=\"\u002Fupload\u002F167575545480437-ebty.jpg\" loading=\"lazy\" title=\"Lombok @Data 注解\" alt=\"Lombok @Data 注解\">\u003Cspan class=\"image-caption\">Lombok @Data 注解\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Ch2>二、对比编译后的源码\u003C\u002Fh2>\n\u003Cp>先来看看下面这两段 Lombok 注解使用示例：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>@Getter\n@Setter\n@RequiredArgsConstructor\n@ToString\n@EqualsAndHashCode\npublic class User1 {\n    private Long id;\n    private String username;\n    \u002F\u002F 更多字段省略 ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre>\u003Ccode>@Data\npublic class User2 {\n    private Long id;\n    private String username;\n    \u002F\u002F 更多字段省略 ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>编译代码，看看 Lombok 为这两个实体类生成的代码：\u003C\u002Fp>\n\u003Cp>\n\u003Cimg src=\"\u002Fupload\u002F167575604936795-AkVz.jpg\" loading=\"lazy\">\n\u003C\u002Fp>\n\u003Cp>\u003Cstrong>User1.java\u003C\u002Fstrong> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F\u002F\n\u002F\u002F Source code recreated from a .class file by IntelliJ IDEA\n\u002F\u002F (powered by FernFlower decompiler)\n\u002F\u002F\n\npackage com.mashangan.coursefrontend.model;\n\npublic class User1 {\n    private Long id;\n    private String username;\n\n    public Long getId() {\n        return this.id;\n    }\n\n    public String getUsername() {\n        return this.username;\n    }\n\n    public void setId(final Long id) {\n        this.id = id;\n    }\n\n    public void setUsername(final String username) {\n        this.username = username;\n    }\n\n    public User1() {\n    }\n\n    public String toString() {\n        return &quot;User1(id=&quot; + this.getId() + &quot;, username=&quot; + this.getUsername() + &quot;)&quot;;\n    }\n\n    public boolean equals(final Object o) {\n        if (o == this) {\n            return true;\n        } else if (!(o instanceof User1)) {\n            return false;\n        } else {\n            User1 other = (User1)o;\n            if (!other.canEqual(this)) {\n                return false;\n            } else {\n                Object this$id = this.getId();\n                Object other$id = other.getId();\n                if (this$id == null) {\n                    if (other$id != null) {\n                        return false;\n                    }\n                } else if (!this$id.equals(other$id)) {\n                    return false;\n                }\n\n                Object this$username = this.getUsername();\n                Object other$username = other.getUsername();\n                if (this$username == null) {\n                    if (other$username != null) {\n                        return false;\n                    }\n                } else if (!this$username.equals(other$username)) {\n                    return false;\n                }\n\n                return true;\n            }\n        }\n    }\n\n    protected boolean canEqual(final Object other) {\n        return other instanceof User1;\n    }\n\n    public int hashCode() {\n        int PRIME = true;\n        int result = 1;\n        Object $id = this.getId();\n        result = result * 59 + ($id == null ? 43 : $id.hashCode());\n        Object $username = this.getUsername();\n        result = result * 59 + ($username == null ? 43 : $username.hashCode());\n        return result;\n    }\n}\n\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>User2.java\u003C\u002Fstrong> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode>\u002F\u002F\n\u002F\u002F Source code recreated from a .class file by IntelliJ IDEA\n\u002F\u002F (powered by FernFlower decompiler)\n\u002F\u002F\n\npackage com.mashangan.coursefrontend.model;\n\npublic class User2 {\n    private Long id;\n    private String username;\n\n    public User2() {\n    }\n\n    public Long getId() {\n        return this.id;\n    }\n\n    public String getUsername() {\n        return this.username;\n    }\n\n    public void setId(final Long id) {\n        this.id = id;\n    }\n\n    public void setUsername(final String username) {\n        this.username = username;\n    }\n\n    public boolean equals(final Object o) {\n        if (o == this) {\n            return true;\n        } else if (!(o instanceof User2)) {\n            return false;\n        } else {\n            User2 other = (User2)o;\n            if (!other.canEqual(this)) {\n                return false;\n            } else {\n                Object this$id = this.getId();\n                Object other$id = other.getId();\n                if (this$id == null) {\n                    if (other$id != null) {\n                        return false;\n                    }\n                } else if (!this$id.equals(other$id)) {\n                    return false;\n                }\n\n                Object this$username = this.getUsername();\n                Object other$username = other.getUsername();\n                if (this$username == null) {\n                    if (other$username != null) {\n                        return false;\n                    }\n                } else if (!this$username.equals(other$username)) {\n                    return false;\n                }\n\n                return true;\n            }\n        }\n    }\n\n    protected boolean canEqual(final Object other) {\n        return other instanceof User2;\n    }\n\n    public int hashCode() {\n        int PRIME = true;\n        int result = 1;\n        Object $id = this.getId();\n        result = result * 59 + ($id == null ? 43 : $id.hashCode());\n        Object $username = this.getUsername();\n        result = result * 59 + ($username == null ? 43 : $username.hashCode());\n        return result;\n    }\n\n    public String toString() {\n        return &quot;User2(id=&quot; + this.getId() + &quot;, username=&quot; + this.getUsername() + &quot;)&quot;;\n    }\n}\n\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>通过对比，会发现两个类生成的代码一致，包含：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>生成了所有字段的 \u003Ccode>get\u002Fset\u003C\u002Fcode>   方法；\u003C\u002Fli>\n\u003Cli>实体类的无参构造器；\u003C\u002Fli>\n\u003Cli>\u003Ccode>toString()\u003C\u002Fcode> 方法；\u003C\u002Fli>\n\u003Cli>\u003Ccode>hashCode()\u003C\u002Fcode> 方法；\u003C\u002Fli>\n\u003Cli>\u003Ccode>equals()\u003C\u002Fcode> 方法；\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>三、Lombok @Data 注解是何时工作的？\u003C\u002Fh2>\n\u003Cp>Lombok \u003Ccode>@Data\u003C\u002Fcode> 注解会在\u003Cstrong>代码的编译阶段\u003C\u002Fstrong>，为你静默生成相关样板代码。\u003C\u002Fp>\n\u003Ch2>四、staticConstructor 参数\u003C\u002Fh2>\n\u003Cp>先看一段示例代码：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>@Data(staticConstructor = &quot;create&quot;)\npublic class User2 {\n    private Long id;\n    private String username;\n    \u002F\u002F 更多字段省略 ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>如果你为 \u003Ccode>@Data\u003C\u002Fcode> 注解指定了 \u003Ccode>staticConstructor\u003C\u002Fcode> 参数，再次编译代码，看看实际生成的代码：\u003C\u002Fp>\n\u003Cp>\n\u003Cimg src=\"\u002Fupload\u002F167575815968795-uiHT.jpg\" loading=\"lazy\" title=\"Lombok staticConstructor\" alt=\"Lombok staticConstructor\">\u003Cspan class=\"image-caption\">Lombok staticConstructor\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>由图可知，\u003Ccode>@Data(staticConstructor = &quot;create&quot;)\u003C\u002Fcode> 生成了一个名为 \u003Ccode>create()\u003C\u002Fcode> 静态实体类生成方法，同时私有化了无参构造器。\u003C\u002Fp>\n\u003Ch2>五、Lombok @Data 排除指定字段\u003C\u002Fh2>\n\u003Cp>\u003Ccode>@Data\u003C\u002Fcode> 注解生成的模板方法中，默认会带上所有字段，如果针对某个字段不想生成 \u003Ccode>get\u002Fset\u003C\u002Fcode> 方法，或者是 \u003Ccode>toString()\u003C\u002Fcode> 、\u003Ccode>equals()\u003C\u002Fcode> 、\u003Ccode>hashCode()\u003C\u002Fcode> 方法排除某个字段的判断，示例代码如下：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>@Data\npublic class User3 {\n\t\u002F\u002F 不生成此字段的 set 方法\n    @Setter(value = AccessLevel.NONE)\n    private Long id;\n    \n    \u002F\u002F 不生成此字段的 get 方法\n    @Getter(value = AccessLevel.NONE)\n    private String username;\n    \n    \u002F\u002F toString() 方法中不打印此字段\n    @ToString.Exclude\n    private String email;\n    \n    \u002F\u002F 1. equals() 和 hashCode() 方法中排除此字段的判断\n    \u002F\u002F 2. toString() 方法中不打印此字段\n    @EqualsAndHashCode.Exclude\n    @ToString.Exclude\n    private Integer sex;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>六、关于 Lombok 参数构造器\u003C\u002Fh2>\n\u003Cp>如果仅添加 @Data 注解，默认只会生成一个无参的构造器；当同时添加 \u003Ccode>@Data\u003C\u002Fcode> 和 \u003Ccode>@Builder\u003C\u002Fcode> 注解时，仅会生成一个全参构造器。在日常项目中，通常会在实体类上额外添加 \u003Ccode>@AllArgsConstructor\u003C\u002Fcode>、\u003Ccode>@NoArgsConstructor\u003C\u002Fcode> 注解, 示例代码如下：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\npublic class User4 {\n    private Long id;\n    private String username;\n\n    \u002F\u002F 更多字段省略 ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>这样，该实体类就基本拥有了常用的一些模板方法，包括 \u003Ccode>builder\u003C\u002Fcode> 构造器模式、无参构造器、全参构造器等。\u003C\u002Fp>\n\u003Ch2>七、结语\u003C\u002Fh2>\n\u003Cp>本小节中，我们学习了 Lombok 的 @Data 注解，以及通过简单的代码示例，知道了如何在项目中使用它。总之，Lombok 是一个被广泛应用于生产环境的成熟工具，它可以帮助开发者生成实体类通用的一些样板代码，从而帮助我们节省大量的开发时间，还没有使用它的小伙伴们，可以赶快安排上了。\u003C\u002Fp>\n13:Tc8d0,\u003Ch2 id=\"toc-0\">一 、什么是 Lombok @Data 注解？\u003C\u002Fh2>\n\u003Cblockquote>\n\u003Cp>在 Lombok 中，\u003Ccode>@Data\u003C\u002Fcode> 是一个\u003Cstrong>集合注解\u003C\u002Fstrong>，它整合了多个 Lombok 注解，用于快速生成实体类对象所需的常用方法。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>一个 \u003Ccode>@Data\u003C\u002Fcode> 注解相当于同时使用了如下注解 ：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cp>\u003Ccode>@Getter\u003C\u002Fcode> 和 \u003Ccode>@Setter\u003C\u002Fcode>：为每个字段生成 \u003Ccode>getter\u003C\u002Fcode> 和 \u003Ccode>setter\u003C\u002Fcode> 方法；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>@ToString\u003C\u002Fcode>：生成 \u003Ccode>toString()\u003C\u002Fcode> 方法，打印对象的所有字段；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>@EqualsAndHashCode\u003C\u002Fcode>：生成 \u003Ccode>equals()\u003C\u002Fcode> 和 \u003Ccode>hashCode()\u003C\u002Fcode> 方法，基于字段值实现对象比较；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Ccode>@RequiredArgsConstructor\u003C\u002Fcode>：生成包含 \u003Ccode>final\u003C\u002Fcode> 和 \u003Ccode>@NonNull\u003C\u002Fcode> 字段的构造方法；\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\n\u003Cdiv class=\"img-loading\">\u003Cimg src=\"\u002Fupload\u002F167575545480437-ebty.jpg\" loading=\"lazy\" title=\"Lombok @Data 注解\" alt=\"Lombok @Data 注解\">\u003C\u002Fdiv>\u003Cspan class=\"image-caption\">Lombok @Data 注解\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Ch2 id=\"toc-1\">二、对比编译后的源码\u003C\u002Fh2>\n\u003Cp>先来看看下面这两段 Lombok 注解使用示例：\u003C\u002Fp>\n\u003Cdiv class=\"language-java\" data-ext=\"java\" data-code=\"%40Getter%0A%40Setter%0A%40RequiredArgsConstructor%0A%40ToString%0A%40EqualsAndHashCode%0Apublic%20class%20User1%20%7B%0A%20%20%20%20private%20Long%20id%3B%0A%20%20%20%20private%20String%20username%3B%0A%20%20%20%20%2F%2F%20%E6%9B%B4%E5%A4%9A%E5%AD%97%E6%AE%B5%E7%9C%81%E7%95%A5%20...%0A%7D%0A\">\n        \u003Cbutton class=\"vp-copy-code-button\" data-copy data-copied=\"已复制\" aria-label=\"复制代码\">\u003C\u002Fbutton>\n        \u003Cpre>\u003Ccode class=\"language-java\">\u003Cspan class=\"token annotation punctuation\">@Getter\u003C\u002Fspan>\n\u003Cspan class=\"token annotation punctuation\">@Setter\u003C\u002Fspan>\n\u003Cspan class=\"token annotation punctuation\">@RequiredArgsConstructor\u003C\u002Fspan>\n\u003Cspan class=\"token annotation punctuation\">@ToString\u003C\u002Fspan>\n\u003Cspan class=\"token annotation punctuation\">@EqualsAndHashCode\u003C\u002Fspan>\n\u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">class\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User1\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Long\u003C\u002Fspan> id\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> username\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token comment\">\u002F\u002F 更多字段省略 ...\u003C\u002Fspan>\n\u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n      \u003C\u002Fdiv>\n\u003Cdiv class=\"language-java\" data-ext=\"java\" data-code=\"%40Data%0Apublic%20class%20User2%20%7B%0A%20%20%20%20private%20Long%20id%3B%0A%20%20%20%20private%20String%20username%3B%0A%20%20%20%20%2F%2F%20%E6%9B%B4%E5%A4%9A%E5%AD%97%E6%AE%B5%E7%9C%81%E7%95%A5%20...%0A%7D%0A\">\n        \u003Cbutton class=\"vp-copy-code-button\" data-copy data-copied=\"已复制\" aria-label=\"复制代码\">\u003C\u002Fbutton>\n        \u003Cpre>\u003Ccode class=\"language-java\">\u003Cspan class=\"token annotation punctuation\">@Data\u003C\u002Fspan>\n\u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">class\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User2\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Long\u003C\u002Fspan> id\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> username\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token comment\">\u002F\u002F 更多字段省略 ...\u003C\u002Fspan>\n\u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n      \u003C\u002Fdiv>\n\u003Cp>编译代码，看看 Lombok 为这两个实体类生成的代码：\u003C\u002Fp>\n\u003Cp>\n\u003Cdiv class=\"img-loading\">\u003Cimg src=\"\u002Fupload\u002F167575604936795-AkVz.jpg\" loading=\"lazy\">\u003C\u002Fdiv>\n\u003C\u002Fp>\n\u003Cp>\u003Cstrong>User1.java\u003C\u002Fstrong> :\u003C\u002Fp>\n\u003Cdiv class=\"language-java\" data-ext=\"java\" data-code=\"%2F%2F%0A%2F%2F%20Source%20code%20recreated%20from%20a%20.class%20file%20by%20IntelliJ%20IDEA%0A%2F%2F%20(powered%20by%20FernFlower%20decompiler)%0A%2F%2F%0A%0Apackage%20com.mashangan.coursefrontend.model%3B%0A%0Apublic%20class%20User1%20%7B%0A%20%20%20%20private%20Long%20id%3B%0A%20%20%20%20private%20String%20username%3B%0A%0A%20%20%20%20public%20Long%20getId()%20%7B%0A%20%20%20%20%20%20%20%20return%20this.id%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20String%20getUsername()%20%7B%0A%20%20%20%20%20%20%20%20return%20this.username%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20void%20setId(final%20Long%20id)%20%7B%0A%20%20%20%20%20%20%20%20this.id%20%3D%20id%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20void%20setUsername(final%20String%20username)%20%7B%0A%20%20%20%20%20%20%20%20this.username%20%3D%20username%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20User1()%20%7B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20String%20toString()%20%7B%0A%20%20%20%20%20%20%20%20return%20%22User1(id%3D%22%20%2B%20this.getId()%20%2B%20%22%2C%20username%3D%22%20%2B%20this.getUsername()%20%2B%20%22)%22%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20boolean%20equals(final%20Object%20o)%20%7B%0A%20%20%20%20%20%20%20%20if%20(o%20%3D%3D%20this)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(!(o%20instanceof%20User1))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20User1%20other%20%3D%20(User1)o%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(!other.canEqual(this))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Object%20this%24id%20%3D%20this.getId()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Object%20other%24id%20%3D%20other.getId()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this%24id%20%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(other%24id%20!%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(!this%24id.equals(other%24id))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Object%20this%24username%20%3D%20this.getUsername()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Object%20other%24username%20%3D%20other.getUsername()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this%24username%20%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(other%24username%20!%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(!this%24username.equals(other%24username))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20protected%20boolean%20canEqual(final%20Object%20other)%20%7B%0A%20%20%20%20%20%20%20%20return%20other%20instanceof%20User1%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20int%20hashCode()%20%7B%0A%20%20%20%20%20%20%20%20int%20PRIME%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20int%20result%20%3D%201%3B%0A%20%20%20%20%20%20%20%20Object%20%24id%20%3D%20this.getId()%3B%0A%20%20%20%20%20%20%20%20result%20%3D%20result%20*%2059%20%2B%20(%24id%20%3D%3D%20null%20%3F%2043%20%3A%20%24id.hashCode())%3B%0A%20%20%20%20%20%20%20%20Object%20%24username%20%3D%20this.getUsername()%3B%0A%20%20%20%20%20%20%20%20result%20%3D%20result%20*%2059%20%2B%20(%24username%20%3D%3D%20null%20%3F%2043%20%3A%20%24username.hashCode())%3B%0A%20%20%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%0A%7D%0A%0A\">\n        \u003Cbutton class=\"vp-copy-code-button\" data-copy data-copied=\"已复制\" aria-label=\"复制代码\">\u003C\u002Fbutton>\n        \u003Cpre>\u003Ccode class=\"language-java\">\u003Cspan class=\"token comment\">\u002F\u002F\u003C\u002Fspan>\n\u003Cspan class=\"token comment\">\u002F\u002F Source code recreated from a .class file by IntelliJ IDEA\u003C\u002Fspan>\n\u003Cspan class=\"token comment\">\u002F\u002F (powered by FernFlower decompiler)\u003C\u002Fspan>\n\u003Cspan class=\"token comment\">\u002F\u002F\u003C\u002Fspan>\n\n\u003Cspan class=\"token keyword\">package\u003C\u002Fspan> \u003Cspan class=\"token namespace\">com\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>mashangan\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>coursefrontend\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>model\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n\n\u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">class\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User1\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Long\u003C\u002Fspan> id\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> username\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Long\u003C\u002Fspan> \u003Cspan class=\"token function\">getId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>id\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> \u003Cspan class=\"token function\">getUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>username\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">void\u003C\u002Fspan> \u003Cspan class=\"token function\">setId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">final\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Long\u003C\u002Fspan> id\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>id \u003Cspan class=\"token operator\">=\u003C\u002Fspan> id\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">void\u003C\u002Fspan> \u003Cspan class=\"token function\">setUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">final\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> username\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>username \u003Cspan class=\"token operator\">=\u003C\u002Fspan> username\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User1\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> \u003Cspan class=\"token function\">toString\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token string\">\"User1(id=\"\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token string\">\", username=\"\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token string\">\")\"\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">boolean\u003C\u002Fspan> \u003Cspan class=\"token function\">equals\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">final\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> o\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>o \u003Cspan class=\"token operator\">==\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n            \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">true\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"token keyword\">else\u003C\u002Fspan> \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token operator\">!\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>o \u003Cspan class=\"token keyword\">instanceof\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User1\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n            \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"token keyword\">else\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n            \u003Cspan class=\"token class-name\">User1\u003C\u002Fspan> other \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token class-name\">User1\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>o\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n            \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token operator\">!\u003C\u002Fspan>other\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">canEqual\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n            \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"token keyword\">else\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$id \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> other$id \u003Cspan class=\"token operator\">=\u003C\u002Fspan> other\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$id \u003Cspan class=\"token operator\">==\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                    \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>other$id \u003Cspan class=\"token operator\">!=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n                \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"token keyword\">else\u003C\u002Fspan> \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token operator\">!\u003C\u002Fspan>\u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$id\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">equals\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>other$id\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                    \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n                \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$username \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> other$username \u003Cspan class=\"token operator\">=\u003C\u002Fspan> other\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$username \u003Cspan class=\"token operator\">==\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                    \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>other$username \u003Cspan class=\"token operator\">!=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n                \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"token keyword\">else\u003C\u002Fspan> \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token operator\">!\u003C\u002Fspan>\u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$username\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">equals\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>other$username\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                    \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n                \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">true\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n            \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n        \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">protected\u003C\u002Fspan> \u003Cspan class=\"token keyword\">boolean\u003C\u002Fspan> \u003Cspan class=\"token function\">canEqual\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">final\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> other\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> other \u003Cspan class=\"token keyword\">instanceof\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User1\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">int\u003C\u002Fspan> \u003Cspan class=\"token function\">hashCode\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">int\u003C\u002Fspan> \u003Cspan class=\"token constant\">PRIME\u003C\u002Fspan> \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token boolean\">true\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">int\u003C\u002Fspan> result \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token number\">1\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> $id \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        result \u003Cspan class=\"token operator\">=\u003C\u002Fspan> result \u003Cspan class=\"token operator\">*\u003C\u002Fspan> \u003Cspan class=\"token number\">59\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>$id \u003Cspan class=\"token operator\">==\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan> \u003Cspan class=\"token operator\">?\u003C\u002Fspan> \u003Cspan class=\"token number\">43\u003C\u002Fspan> \u003Cspan class=\"token operator\">:\u003C\u002Fspan> $id\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">hashCode\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> $username \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        result \u003Cspan class=\"token operator\">=\u003C\u002Fspan> result \u003Cspan class=\"token operator\">*\u003C\u002Fspan> \u003Cspan class=\"token number\">59\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>$username \u003Cspan class=\"token operator\">==\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan> \u003Cspan class=\"token operator\">?\u003C\u002Fspan> \u003Cspan class=\"token number\">43\u003C\u002Fspan> \u003Cspan class=\"token operator\">:\u003C\u002Fspan> $username\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">hashCode\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> result\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n\u003C\u002Fcode>\u003C\u002Fpre>\n      \u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>User2.java\u003C\u002Fstrong> :\u003C\u002Fp>\n\u003Cdiv class=\"language-java\" data-ext=\"java\" data-code=\"%2F%2F%0A%2F%2F%20Source%20code%20recreated%20from%20a%20.class%20file%20by%20IntelliJ%20IDEA%0A%2F%2F%20(powered%20by%20FernFlower%20decompiler)%0A%2F%2F%0A%0Apackage%20com.mashangan.coursefrontend.model%3B%0A%0Apublic%20class%20User2%20%7B%0A%20%20%20%20private%20Long%20id%3B%0A%20%20%20%20private%20String%20username%3B%0A%0A%20%20%20%20public%20User2()%20%7B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20Long%20getId()%20%7B%0A%20%20%20%20%20%20%20%20return%20this.id%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20String%20getUsername()%20%7B%0A%20%20%20%20%20%20%20%20return%20this.username%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20void%20setId(final%20Long%20id)%20%7B%0A%20%20%20%20%20%20%20%20this.id%20%3D%20id%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20void%20setUsername(final%20String%20username)%20%7B%0A%20%20%20%20%20%20%20%20this.username%20%3D%20username%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20boolean%20equals(final%20Object%20o)%20%7B%0A%20%20%20%20%20%20%20%20if%20(o%20%3D%3D%20this)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20if%20(!(o%20instanceof%20User2))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20User2%20other%20%3D%20(User2)o%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20(!other.canEqual(this))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Object%20this%24id%20%3D%20this.getId()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Object%20other%24id%20%3D%20other.getId()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this%24id%20%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(other%24id%20!%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(!this%24id.equals(other%24id))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Object%20this%24username%20%3D%20this.getUsername()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Object%20other%24username%20%3D%20other.getUsername()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(this%24username%20%3D%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(other%24username%20!%3D%20null)%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%20else%20if%20(!this%24username.equals(other%24username))%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20true%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20protected%20boolean%20canEqual(final%20Object%20other)%20%7B%0A%20%20%20%20%20%20%20%20return%20other%20instanceof%20User2%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20int%20hashCode()%20%7B%0A%20%20%20%20%20%20%20%20int%20PRIME%20%3D%20true%3B%0A%20%20%20%20%20%20%20%20int%20result%20%3D%201%3B%0A%20%20%20%20%20%20%20%20Object%20%24id%20%3D%20this.getId()%3B%0A%20%20%20%20%20%20%20%20result%20%3D%20result%20*%2059%20%2B%20(%24id%20%3D%3D%20null%20%3F%2043%20%3A%20%24id.hashCode())%3B%0A%20%20%20%20%20%20%20%20Object%20%24username%20%3D%20this.getUsername()%3B%0A%20%20%20%20%20%20%20%20result%20%3D%20result%20*%2059%20%2B%20(%24username%20%3D%3D%20null%20%3F%2043%20%3A%20%24username.hashCode())%3B%0A%20%20%20%20%20%20%20%20return%20result%3B%0A%20%20%20%20%7D%0A%0A%20%20%20%20public%20String%20toString()%20%7B%0A%20%20%20%20%20%20%20%20return%20%22User2(id%3D%22%20%2B%20this.getId()%20%2B%20%22%2C%20username%3D%22%20%2B%20this.getUsername()%20%2B%20%22)%22%3B%0A%20%20%20%20%7D%0A%7D%0A%0A\">\n        \u003Cbutton class=\"vp-copy-code-button\" data-copy data-copied=\"已复制\" aria-label=\"复制代码\">\u003C\u002Fbutton>\n        \u003Cpre>\u003Ccode class=\"language-java\">\u003Cspan class=\"token comment\">\u002F\u002F\u003C\u002Fspan>\n\u003Cspan class=\"token comment\">\u002F\u002F Source code recreated from a .class file by IntelliJ IDEA\u003C\u002Fspan>\n\u003Cspan class=\"token comment\">\u002F\u002F (powered by FernFlower decompiler)\u003C\u002Fspan>\n\u003Cspan class=\"token comment\">\u002F\u002F\u003C\u002Fspan>\n\n\u003Cspan class=\"token keyword\">package\u003C\u002Fspan> \u003Cspan class=\"token namespace\">com\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>mashangan\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>coursefrontend\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>model\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n\n\u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">class\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User2\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Long\u003C\u002Fspan> id\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> username\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User2\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Long\u003C\u002Fspan> \u003Cspan class=\"token function\">getId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>id\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> \u003Cspan class=\"token function\">getUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>username\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">void\u003C\u002Fspan> \u003Cspan class=\"token function\">setId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">final\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Long\u003C\u002Fspan> id\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>id \u003Cspan class=\"token operator\">=\u003C\u002Fspan> id\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">void\u003C\u002Fspan> \u003Cspan class=\"token function\">setUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">final\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> username\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>username \u003Cspan class=\"token operator\">=\u003C\u002Fspan> username\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">boolean\u003C\u002Fspan> \u003Cspan class=\"token function\">equals\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">final\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> o\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>o \u003Cspan class=\"token operator\">==\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n            \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">true\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"token keyword\">else\u003C\u002Fspan> \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token operator\">!\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>o \u003Cspan class=\"token keyword\">instanceof\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User2\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n            \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"token keyword\">else\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n            \u003Cspan class=\"token class-name\">User2\u003C\u002Fspan> other \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token class-name\">User2\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>o\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n            \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token operator\">!\u003C\u002Fspan>other\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">canEqual\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n            \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"token keyword\">else\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$id \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> other$id \u003Cspan class=\"token operator\">=\u003C\u002Fspan> other\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$id \u003Cspan class=\"token operator\">==\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                    \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>other$id \u003Cspan class=\"token operator\">!=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n                \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"token keyword\">else\u003C\u002Fspan> \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token operator\">!\u003C\u002Fspan>\u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$id\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">equals\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>other$id\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                    \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n                \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$username \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> other$username \u003Cspan class=\"token operator\">=\u003C\u002Fspan> other\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$username \u003Cspan class=\"token operator\">==\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                    \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>other$username \u003Cspan class=\"token operator\">!=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n                \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan> \u003Cspan class=\"token keyword\">else\u003C\u002Fspan> \u003Cspan class=\"token keyword\">if\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token operator\">!\u003C\u002Fspan>\u003Cspan class=\"token keyword\">this\u003C\u002Fspan>$username\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">equals\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>other$username\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n                    \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">false\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n                \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n                \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token boolean\">true\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n            \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n        \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">protected\u003C\u002Fspan> \u003Cspan class=\"token keyword\">boolean\u003C\u002Fspan> \u003Cspan class=\"token function\">canEqual\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token keyword\">final\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> other\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> other \u003Cspan class=\"token keyword\">instanceof\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User2\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">int\u003C\u002Fspan> \u003Cspan class=\"token function\">hashCode\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">int\u003C\u002Fspan> \u003Cspan class=\"token constant\">PRIME\u003C\u002Fspan> \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token boolean\">true\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">int\u003C\u002Fspan> result \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token number\">1\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> $id \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        result \u003Cspan class=\"token operator\">=\u003C\u002Fspan> result \u003Cspan class=\"token operator\">*\u003C\u002Fspan> \u003Cspan class=\"token number\">59\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>$id \u003Cspan class=\"token operator\">==\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan> \u003Cspan class=\"token operator\">?\u003C\u002Fspan> \u003Cspan class=\"token number\">43\u003C\u002Fspan> \u003Cspan class=\"token operator\">:\u003C\u002Fspan> $id\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">hashCode\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token class-name\">Object\u003C\u002Fspan> $username \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        result \u003Cspan class=\"token operator\">=\u003C\u002Fspan> result \u003Cspan class=\"token operator\">*\u003C\u002Fspan> \u003Cspan class=\"token number\">59\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>$username \u003Cspan class=\"token operator\">==\u003C\u002Fspan> \u003Cspan class=\"token keyword\">null\u003C\u002Fspan> \u003Cspan class=\"token operator\">?\u003C\u002Fspan> \u003Cspan class=\"token number\">43\u003C\u002Fspan> \u003Cspan class=\"token operator\">:\u003C\u002Fspan> $username\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">hashCode\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> result\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n    \u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> \u003Cspan class=\"token function\">toString\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n        \u003Cspan class=\"token keyword\">return\u003C\u002Fspan> \u003Cspan class=\"token string\">\"User2(id=\"\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getId\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token string\">\", username=\"\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token keyword\">this\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token function\">getUsername\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan> \u003Cspan class=\"token operator\">+\u003C\u002Fspan> \u003Cspan class=\"token string\">\")\"\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\n\u003C\u002Fcode>\u003C\u002Fpre>\n      \u003C\u002Fdiv>\n\u003Cp>通过对比，会发现两个类生成的代码一致，包含：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>生成了所有字段的 \u003Ccode>get\u002Fset\u003C\u002Fcode>   方法；\u003C\u002Fli>\n\u003Cli>实体类的无参构造器；\u003C\u002Fli>\n\u003Cli>\u003Ccode>toString()\u003C\u002Fcode> 方法；\u003C\u002Fli>\n\u003Cli>\u003Ccode>hashCode()\u003C\u002Fcode> 方法；\u003C\u002Fli>\n\u003Cli>\u003Ccode>equals()\u003C\u002Fcode> 方法；\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"toc-2\">三、Lombok @Data 注解是何时工作的？\u003C\u002Fh2>\n\u003Cp>Lombok \u003Ccode>@Data\u003C\u002Fcode> 注解会在\u003Cstrong>代码的编译阶段\u003C\u002Fstrong>，为你静默生成相关样板代码。\u003C\u002Fp>\n\u003Ch2 id=\"toc-3\">四、staticConstructor 参数\u003C\u002Fh2>\n\u003Cp>先看一段示例代码：\u003C\u002Fp>\n\u003Cdiv class=\"language-java\" data-ext=\"java\" data-code=\"%40Data(staticConstructor%20%3D%20%22create%22)%0Apublic%20class%20User2%20%7B%0A%20%20%20%20private%20Long%20id%3B%0A%20%20%20%20private%20String%20username%3B%0A%20%20%20%20%2F%2F%20%E6%9B%B4%E5%A4%9A%E5%AD%97%E6%AE%B5%E7%9C%81%E7%95%A5%20...%0A%7D%0A\">\n        \u003Cbutton class=\"vp-copy-code-button\" data-copy data-copied=\"已复制\" aria-label=\"复制代码\">\u003C\u002Fbutton>\n        \u003Cpre>\u003Ccode class=\"language-java\">\u003Cspan class=\"token annotation punctuation\">@Data\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>staticConstructor \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token string\">\"create\"\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\n\u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">class\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User2\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Long\u003C\u002Fspan> id\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> username\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token comment\">\u002F\u002F 更多字段省略 ...\u003C\u002Fspan>\n\u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n      \u003C\u002Fdiv>\n\u003Cp>如果你为 \u003Ccode>@Data\u003C\u002Fcode> 注解指定了 \u003Ccode>staticConstructor\u003C\u002Fcode> 参数，再次编译代码，看看实际生成的代码：\u003C\u002Fp>\n\u003Cp>\n\u003Cdiv class=\"img-loading\">\u003Cimg src=\"\u002Fupload\u002F167575815968795-uiHT.jpg\" loading=\"lazy\" title=\"Lombok staticConstructor\" alt=\"Lombok staticConstructor\">\u003C\u002Fdiv>\u003Cspan class=\"image-caption\">Lombok staticConstructor\u003C\u002Fspan>\n\u003C\u002Fp>\n\u003Cp>由图可知，\u003Ccode>@Data(staticConstructor = &quot;create&quot;)\u003C\u002Fcode> 生成了一个名为 \u003Ccode>create()\u003C\u002Fcode> 静态实体类生成方法，同时私有化了无参构造器。\u003C\u002Fp>\n\u003Ch2 id=\"toc-4\">五、Lombok @Data 排除指定字段\u003C\u002Fh2>\n\u003Cp>\u003Ccode>@Data\u003C\u002Fcode> 注解生成的模板方法中，默认会带上所有字段，如果针对某个字段不想生成 \u003Ccode>get\u002Fset\u003C\u002Fcode> 方法，或者是 \u003Ccode>toString()\u003C\u002Fcode> 、\u003Ccode>equals()\u003C\u002Fcode> 、\u003Ccode>hashCode()\u003C\u002Fcode> 方法排除某个字段的判断，示例代码如下：\u003C\u002Fp>\n\u003Cdiv class=\"language-java\" data-ext=\"java\" data-code=\"%40Data%0Apublic%20class%20User3%20%7B%0A%09%2F%2F%20%E4%B8%8D%E7%94%9F%E6%88%90%E6%AD%A4%E5%AD%97%E6%AE%B5%E7%9A%84%20set%20%E6%96%B9%E6%B3%95%0A%20%20%20%20%40Setter(value%20%3D%20AccessLevel.NONE)%0A%20%20%20%20private%20Long%20id%3B%0A%20%20%20%20%0A%20%20%20%20%2F%2F%20%E4%B8%8D%E7%94%9F%E6%88%90%E6%AD%A4%E5%AD%97%E6%AE%B5%E7%9A%84%20get%20%E6%96%B9%E6%B3%95%0A%20%20%20%20%40Getter(value%20%3D%20AccessLevel.NONE)%0A%20%20%20%20private%20String%20username%3B%0A%20%20%20%20%0A%20%20%20%20%2F%2F%20toString()%20%E6%96%B9%E6%B3%95%E4%B8%AD%E4%B8%8D%E6%89%93%E5%8D%B0%E6%AD%A4%E5%AD%97%E6%AE%B5%0A%20%20%20%20%40ToString.Exclude%0A%20%20%20%20private%20String%20email%3B%0A%20%20%20%20%0A%20%20%20%20%2F%2F%201.%20equals()%20%E5%92%8C%20hashCode()%20%E6%96%B9%E6%B3%95%E4%B8%AD%E6%8E%92%E9%99%A4%E6%AD%A4%E5%AD%97%E6%AE%B5%E7%9A%84%E5%88%A4%E6%96%AD%0A%20%20%20%20%2F%2F%202.%20toString()%20%E6%96%B9%E6%B3%95%E4%B8%AD%E4%B8%8D%E6%89%93%E5%8D%B0%E6%AD%A4%E5%AD%97%E6%AE%B5%0A%20%20%20%20%40EqualsAndHashCode.Exclude%0A%20%20%20%20%40ToString.Exclude%0A%20%20%20%20private%20Integer%20sex%3B%0A%7D%0A\">\n        \u003Cbutton class=\"vp-copy-code-button\" data-copy data-copied=\"已复制\" aria-label=\"复制代码\">\u003C\u002Fbutton>\n        \u003Cpre>\u003Ccode class=\"language-java\">\u003Cspan class=\"token annotation punctuation\">@Data\u003C\u002Fspan>\n\u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">class\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User3\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n\t\u003Cspan class=\"token comment\">\u002F\u002F 不生成此字段的 set 方法\u003C\u002Fspan>\n    \u003Cspan class=\"token annotation punctuation\">@Setter\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>value \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token class-name\">AccessLevel\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token constant\">NONE\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Long\u003C\u002Fspan> id\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \n    \u003Cspan class=\"token comment\">\u002F\u002F 不生成此字段的 get 方法\u003C\u002Fspan>\n    \u003Cspan class=\"token annotation punctuation\">@Getter\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">(\u003C\u002Fspan>value \u003Cspan class=\"token operator\">=\u003C\u002Fspan> \u003Cspan class=\"token class-name\">AccessLevel\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">.\u003C\u002Fspan>\u003Cspan class=\"token constant\">NONE\u003C\u002Fspan>\u003Cspan class=\"token punctuation\">)\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> username\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \n    \u003Cspan class=\"token comment\">\u002F\u002F toString() 方法中不打印此字段\u003C\u002Fspan>\n    \u003Cspan class=\"token annotation punctuation\">@ToString.Exclude\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> email\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \n    \u003Cspan class=\"token comment\">\u002F\u002F 1. equals() 和 hashCode() 方法中排除此字段的判断\u003C\u002Fspan>\n    \u003Cspan class=\"token comment\">\u002F\u002F 2. toString() 方法中不打印此字段\u003C\u002Fspan>\n    \u003Cspan class=\"token annotation punctuation\">@EqualsAndHashCode.Exclude\u003C\u002Fspan>\n    \u003Cspan class=\"token annotation punctuation\">@ToString.Exclude\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Integer\u003C\u002Fspan> sex\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n\u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n      \u003C\u002Fdiv>\n\u003Ch2 id=\"toc-5\">六、关于 Lombok 参数构造器\u003C\u002Fh2>\n\u003Cp>如果仅添加 @Data 注解，默认只会生成一个无参的构造器；当同时添加 \u003Ccode>@Data\u003C\u002Fcode> 和 \u003Ccode>@Builder\u003C\u002Fcode> 注解时，仅会生成一个全参构造器。在日常项目中，通常会在实体类上额外添加 \u003Ccode>@AllArgsConstructor\u003C\u002Fcode>、\u003Ccode>@NoArgsConstructor\u003C\u002Fcode> 注解, 示例代码如下：\u003C\u002Fp>\n\u003Cdiv class=\"language-java\" data-ext=\"java\" data-code=\"%40Data%0A%40Builder%0A%40AllArgsConstructor%0A%40NoArgsConstructor%0Apublic%20class%20User4%20%7B%0A%20%20%20%20private%20Long%20id%3B%0A%20%20%20%20private%20String%20username%3B%0A%0A%20%20%20%20%2F%2F%20%E6%9B%B4%E5%A4%9A%E5%AD%97%E6%AE%B5%E7%9C%81%E7%95%A5%20...%0A%7D%0A\">\n        \u003Cbutton class=\"vp-copy-code-button\" data-copy data-copied=\"已复制\" aria-label=\"复制代码\">\u003C\u002Fbutton>\n        \u003Cpre>\u003Ccode class=\"language-java\">\u003Cspan class=\"token annotation punctuation\">@Data\u003C\u002Fspan>\n\u003Cspan class=\"token annotation punctuation\">@Builder\u003C\u002Fspan>\n\u003Cspan class=\"token annotation punctuation\">@AllArgsConstructor\u003C\u002Fspan>\n\u003Cspan class=\"token annotation punctuation\">@NoArgsConstructor\u003C\u002Fspan>\n\u003Cspan class=\"token keyword\">public\u003C\u002Fspan> \u003Cspan class=\"token keyword\">class\u003C\u002Fspan> \u003Cspan class=\"token class-name\">User4\u003C\u002Fspan> \u003Cspan class=\"token punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">Long\u003C\u002Fspan> id\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n    \u003Cspan class=\"token keyword\">private\u003C\u002Fspan> \u003Cspan class=\"token class-name\">String\u003C\u002Fspan> username\u003Cspan class=\"token punctuation\">;\u003C\u002Fspan>\n\n    \u003Cspan class=\"token comment\">\u002F\u002F 更多字段省略 ...\u003C\u002Fspan>\n\u003Cspan class=\"token punctuation\">}\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n      \u003C\u002Fdiv>\n\u003Cp>这样，该实体类就基本拥有了常用的一些模板方法，包括 \u003Ccode>builder\u003C\u002Fcode> 构造器模式、无参构造器、全参构造器等。\u003C\u002Fp>\n\u003Ch2 id=\"toc-6\">七、结语\u003C\u002Fh2>\n\u003Cp>本小节中，我们学习了 Lombok 的 @Data 注解，以及通过简单的代码示例，知道了如何在项目中使用它。总之，Lombok 是一个被广泛应用于生产环境的成熟工具，它可以帮助开发者生成实体类通用的一些样板代码，从而帮助我们节省大量的开发时间，还没有使用它的小伙伴们，可以赶快安排上了。\u003C\u002Fp>"]