1.前言

  今天在看项目代码的时候, 遇到了实体类上加@Builder注解, 之前在开发的时候, 一直没有用过这个注解, 便兴致勃勃地去查了一下资料, 它也是Lombok中的注解, 我们都知道Lombok的注解是在java代码进行编译时对代码进行构建. Lombok插件的出现, 使得开发人员无需写多余的重复代码, 对于java对象的创建更是提供了Builder方法, 使得开发人员在设计实体类的时候, 对外保持private setter, 而对属性的赋值采用Builder方式, 不对外公开属性的写操作, 这种方式更加优雅, 并且符合面向对象编程的封装原则.

2.pom.xml的引入

1 <dependency>
2 <groupId>org.projectlombok</groupId>
3 <artifactId>lombok</artifactId>
4 <version>1.18.12</version>
5 </dependency>

3.@Builder注解的应用

 1 /**
2 * @author lyh
3 * @version v-1.0.0
4 * @since 2021/6/3
5 */
6 public class TestBuilder {
7 public static void main(String[] args) {
8
9 // 使用Builder注解来创建一个User实例
10 User zs = User.builder()
11 .age(15)
12 .name("zs").build();
13 System.out.println(zs);
14
15 /**
16 * 修改原对象的属性值
17 * 注意: 修改实体, 要在实体的@Builder注解里面设置toBuilder = true
18 * toBuilder的默认值是false,这个可以自行去查看@Builder注解类的实现
19 * 里面有这样一行代码:
20 * boolean toBuilder() default false;
21 */
22 zs = zs.toBuilder()
23 .age(18).build();
24 System.out.println(zs);
25
26 }
27 }
28
29 输出:
30 User(name=zs, age=15)
31 User(name=zs, age=18)
32
33 Process finished with exit code 0
 1 @Builder
2 @Getter
3 @ToString
4 public class User {
5
6 private String name;
7
8 private Integer age;
9
10 }

4.@Builder内部工作

  先来看一下使用@Builder注解之后, User类编译后的代码:

 1 public class User {
2 private String name;
3 private Integer age;
4
5 User(String name, Integer age) {
6 this.name = name;
7 this.age = age;
8 }
9
10 public static User.UserBuilder builder() {
11 return new User.UserBuilder();
12 }
13
14 public String getName() {
15 return this.name;
16 }
17
18 public Integer getAge() {
19 return this.age;
20 }
21
22 public String toString() {
23 return "User(name=" + this.getName() + ", age=" + this.getAge() + ")";
24 }
25
26 public static class UserBuilder {
27 private String name;
28 private Integer age;
29
30 UserBuilder() {
31 }
32
33 public User.UserBuilder name(String name) {
34 this.name = name;
35 return this;
36 }
37
38 public User.UserBuilder age(Integer age) {
39 this.age = age;
40 return this;
41 }
42
43 public User build() {
44 return new User(this.name, this.age);
45 }
46
47 public String toString() {
48 return "User.UserBuilder(name=" + this.name + ", age=" + this.age + ")";
49 }
50 }
51 }

  通过上面编译后的User类代码可以看到@Builder的内部工作结果:

  1. 创建了一个名为UserBuilder的静态内部类, 并且具有和实体类相同的属性(称为构建器).

  2. 在构建器中: 对于目标类中的所有的属性, 都会在构建器中创建对应的属性.

  3. 在构建器中: 创建一个无参的default构造方法.

  4. 在构建器中: 对于实体类中的每个参数, 都会对应创建类似于setter方法, 但是方法名是与该参数名是相同的, 并且返回值是构建器本身(便于链式调用).

  5. 在构建器中: 一个build方法, 调用此方法, 就会根据设置的值进行创建对象实例.

  6. 在构建器中: 同时也会生成一个toString() 方法.

  7. 在构建器中: 会创建一个builder()方法, 它的目的是用来创建构建器.

Lombok中的@Builder注解的更多相关文章

  1. lombok 下的@Builder注解用法

    pom依赖 <dependency> <groupId>org.projectlombok</groupId>            <artifactId& ...

  2. 详解Lombok中的@Builder用法

    Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 基础使用 @Builder注释为你的类生成相对略微复杂 ...

  3. java~lombok里的Builder注解

    lombok注解在java进行编译时进行代码的构建,对于java对象的创建工作它可以更优雅,不需要写多余的重复的代码,这对于JAVA开发人员是很重要的,在出现lombok之后,对象的创建工作更提供Bu ...

  4. lombok中的@ToString注解作用

    Lombok是一个很好的工具,节省了很多重写方法,而@ToString就是节省了ToString方法,lombok中@ToString就是节省了我们在模型中的冗余代码下面就来举个例子 import j ...

  5. lombok 中的@Data注解

    今天看到有代码中的Dao包中的类文件,写的极其简洁,甚至引起了开发工具InteliJ的报错,然后程序还能稳健地跑起来. import lombok.Data; @Data public class V ...

  6. Java中lombok @Builder注解使用详解(十八)

    Lombok大家都知道,在使用POJO过程中,它给我们带来了很多便利,省下大量写get.set方法.构造器.equal.toString方法的时间.除此之外,通过@Builder注解,lombok还可 ...

  7. lombok @Builder注解使用的例子、反编译之后的代码详解

    lombok的@Builder实际是建造者模式的一个变种,所以在创建复杂对象时常使用 这里对lombok的@Builder和@Data组合的使用示例 import lombok.Builder; im ...

  8. Lombok之@Builder注解

    Lombok之@Builder注解 前言 Lombok大家都知道,在使用POJO过程中,它给我们带来了很多便利,省下大量写get.set方法.构造器.equal.toString方法的时间.除此之外, ...

  9. 实体继承与@Builder注解共存

    在面向对象的设计里,继承是非常必要的,我们会把共有的属性和方法抽象到父类中,由它统一去实现,而在进行lombok时代之后,更多的打法是使用@Builder来进行对象赋值,我们直接在类上加@Builde ...

随机推荐

  1. JAVAEE_Servlet_12_获取前端页面请求方式 HttpServletRequest HttpServletResponse

    获取前端页面请求方式 * 前端页面发送的请求方式应该是后端服务器需要的请求方式保持一致,若不一致应该提示错误信息. * 获取到前端的请求方式之后通过if语句进行判断, if("GET&quo ...

  2. 浅谈synchronized和volatitle实现线程安全的策略

    什么是线程不安全 我对线程安全的理解就是多个线程同时操作一个共享变量时会产生意料之外的情况,这种情况就是线程不安全.注意:只有写操作才可能出现线程不安全,对共享变量只进行读操作线程是绝对安全的. 具体 ...

  3. aws 通过eksctl 创建eks

    主要需要参考: https://eksctl.io/ https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/getting-started-ek ...

  4. 编写shell脚本让springboot项目在CentOS中开机自启动

    springboot项目部署在CentOS系统上时,如果遇到停电关机,公司的实施人员就得跑到甲方现场重新启动项目并测试,很是麻烦,这里探讨如何编写shell脚本控制springboot项目开机时自动启 ...

  5. GridSearchCV 参数

    GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=1, iid=True, refit=True, c ...

  6. IDAPython类库---idaapi.py的源码

    #ThisfilewasautomaticallygeneratedbySWIG(http://www.swig.org).#Version2.0.12##Donotmakechangestothis ...

  7. drozer源码学习:app

    源码下载:https://github.com/mwrlabs/drozer:模块的源码位于src.drozer.modules,根据模块名来划分文件夹: app.auxiliary.exploit. ...

  8. Linux执行命令报错:Permission denied

    原因:权限被拒 结局办法 chmod -R 777 目录名 更改目录内文件的权限即可

  9. 【vue-05】vue-cli

    Vue-router官网 安装 vue-router是一个插件包,所以我们还是需要用npm 来进行安装.打开命令行工具,进入你的项目目录,输入下面命令. npm install vue-router ...

  10. maven简单入门

    maven简单部署webapp项目流程及注意事项 maven了解 简介: Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM: Project Object Model),一组标准集合 ...