Lombok中的@Builder注解
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的内部工作结果:
创建了一个名为UserBuilder的静态内部类, 并且具有和实体类相同的属性(称为构建器).
在构建器中: 对于目标类中的所有的属性, 都会在构建器中创建对应的属性.
在构建器中: 创建一个无参的default构造方法.
在构建器中: 对于实体类中的每个参数, 都会对应创建类似于setter方法, 但是方法名是与该参数名是相同的, 并且返回值是构建器本身(便于链式调用).
在构建器中: 一个build方法, 调用此方法, 就会根据设置的值进行创建对象实例.
在构建器中: 同时也会生成一个toString() 方法.
在构建器中: 会创建一个builder()方法, 它的目的是用来创建构建器.
Lombok中的@Builder注解的更多相关文章
- lombok 下的@Builder注解用法
pom依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId& ...
- 详解Lombok中的@Builder用法
Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 基础使用 @Builder注释为你的类生成相对略微复杂 ...
- java~lombok里的Builder注解
lombok注解在java进行编译时进行代码的构建,对于java对象的创建工作它可以更优雅,不需要写多余的重复的代码,这对于JAVA开发人员是很重要的,在出现lombok之后,对象的创建工作更提供Bu ...
- lombok中的@ToString注解作用
Lombok是一个很好的工具,节省了很多重写方法,而@ToString就是节省了ToString方法,lombok中@ToString就是节省了我们在模型中的冗余代码下面就来举个例子 import j ...
- lombok 中的@Data注解
今天看到有代码中的Dao包中的类文件,写的极其简洁,甚至引起了开发工具InteliJ的报错,然后程序还能稳健地跑起来. import lombok.Data; @Data public class V ...
- Java中lombok @Builder注解使用详解(十八)
Lombok大家都知道,在使用POJO过程中,它给我们带来了很多便利,省下大量写get.set方法.构造器.equal.toString方法的时间.除此之外,通过@Builder注解,lombok还可 ...
- lombok @Builder注解使用的例子、反编译之后的代码详解
lombok的@Builder实际是建造者模式的一个变种,所以在创建复杂对象时常使用 这里对lombok的@Builder和@Data组合的使用示例 import lombok.Builder; im ...
- Lombok之@Builder注解
Lombok之@Builder注解 前言 Lombok大家都知道,在使用POJO过程中,它给我们带来了很多便利,省下大量写get.set方法.构造器.equal.toString方法的时间.除此之外, ...
- 实体继承与@Builder注解共存
在面向对象的设计里,继承是非常必要的,我们会把共有的属性和方法抽象到父类中,由它统一去实现,而在进行lombok时代之后,更多的打法是使用@Builder来进行对象赋值,我们直接在类上加@Builde ...
随机推荐
- Laravel artisan 命令
获取命令列表 php artisan Laravel Framework 7.26.0 Usage: command [options] [arguments] Options: -h, --help ...
- 【Springboot】Springboot监听器Demo
/** * @author: yq * @date: 2020/8/31 0:01 * @description 自定义事件 */ @Data public class MyEvent extends ...
- Android NDK工程的编译和链接以及使用gdb进行调试
前提条件:已经安装了JDK 6.0.android SDK.NDK r9和eclipsele4.2开发环境. 推荐下载Android开发的综合套件adt-bundle-windows-x86,再下载A ...
- hdu 4099 字典树 + 斐波那契
题意: 给你一个串(最长40位)问你这个串是斐波那契F(n) n <= 99999中的那个数的前缀,如果存在多个输出最小的n否则输出-1. 思路: 给的串最长40位,那 ...
- 从苏宁电器到卡巴斯基第16篇:我在苏宁电器当营业员 VIII
其实不想走,其实很想留 我在之前的故事中说过,在大四的时候,我其实是想考研的,但是看了一段时间的书以后,发现自己实在不是那块料,主要是数学实在是学不明白,那么也就只能作罢了.而后来面试中石化的时候,尽 ...
- mimikatz的使用
mimikatz mimikatz是法国人Gentil Kiwi编写的一款Windows平台下的神器,它具备很多功能,其中最主要的功能是直接从 lsass.exe 进程里获取处于active状态账号的 ...
- java面试一日一题:如何判断一个对象是否为垃圾对象
问题:请讲下在java中如何判断一个对象是否为垃圾 分析:该问题主要考察对java中的垃圾回收,用什么方式去识别一个对象是垃圾: 回答要点: 主要从以下几点去考虑, 1.GC回收的是什么,回收发生在内 ...
- HDU - 3347 Calculate the expression — 模拟 + map存变量
传送门 题意:从输入开始,1.输入样例数:2.然后输入一组样例中的行数n:3.前n-1行为定义变量(之间使用空格隔开),只需要map存进去就可以了(这里有覆盖的情况,故使用mp["s&quo ...
- Spring的安装
Spring的安装 Spring框架包 spring-framework-4.3.6RELEASE-dist.zip http://repo.spring.io/simple/libs-release ...
- es6.4.0安装和配置IK+拼音插件 实现非全拼搜索
安装IK分词器 一.进入到es的plugins文件夹创建文件夹analysis-ikmkdir analysis-ik二.下载ik压缩包文件wget https://github.com/medcl/ ...