@Builder注解使用
创始人
2024-06-02 05:35:47
0

一、@Builder注解

资料来源:http://fendou.net.cn/index.php/a/369
https://blog.csdn.net/qq_39249094/article/details/120881578

  • 作用于类,将其变成建造者模式

  • 可以以链的形式调用

  • 初始化实例对象生成的对象是不可以变的,可以在创建对象的时候进行赋值(如果想改变的话需要在@Builder后面添加参数toBuilder=true)

  • 需要在原来的基础上修改可以加 set 方法,final 字段可以不需要初始化

  • 生成一个全参的构造函数

1.0 Lombok坐标


org.projectlomboklombok         0.10.2

提供在设计数据实体时,对外保持private setter,而对属性的赋值采用Builder的方式,这种方式最优雅,也更符合封装的原则,不对外公开属性的写操作

@Builder声明实体,表示可以进行Builder方式初始化

@Value注解,表示只公开getter,对所有属性的setter都封闭,即private修饰,所以它不能和@Builder一起用

1.1 注解使用


@Builder
@Getter
@Data
publicclassUserInfo {privateStringname;privateStringemail;
​@OverridepublicStringtoString() {return"UserInfo{"+"name='"+name+'\''+", email='"+email+'\''+'}';}
​publicstaticvoidmain(String[] args) {UserInfouserInfo=UserInfo.builder().build();System.out.println("userInfo---->"+userInfo);
​UserInfouserInfo1=UserInfo.builder().name("zzl").email("bgood@sina.com").build();System.out.println("userInfo1---->"+userInfo1);}
}

1.2 注解的属性介绍


1.2.1 toBuilder

  • 设置为 true 可以对这个对象进行拷贝生成新的对象,可以再修改,默认为 false

怎么设置为true?

  @Builder(toBuilder = true)

我们使用UserInfo.builder().build()创建出来之后,还可以修改对象的内容么(不使用set方法)?

我们此时发现如果想对已经构建了的对象在修改的话,会出错,并找不到这个方法,我们只需要在类注解上添加@Builder(toBuilder = true)即可

  
@Builder(toBuilder=true)
@Getter
publicclassUserInfo {}

userInfo=userInfo.toBuilder().name("OK").email("zgood@sina.com").build();

1.2.2 @Builder.Default 注解

非 final 的字段可以有默认值

@Builder.Default
privateStringname="刘亦菲";

我们下面虽然没有对name赋值,但是输出时”name“依然会时"刘亦菲"

UserInfouserInfo=UserInfo.builder().build();
System.out.println("userInfo---->"+userInfo);

final字段加不加Default都可以初始化成功,因为final字段如果第一次不是null的话,就不可修改(简单的来说,final字段有了初始值之后就不可更改)

privatefinalIntegerage=18; 

这两种写法都可以

@Builder.Default
privatefinalIntegerage;  

1.2.3 buildMethodName

指定创建实体类的方法名,默认值为 build

当我们指定内部静态类的方法名为“test”的时候,发现下面已经开始报错了

当我们把这里改成test之后便不会报错了

1.2.4 builderMethodName

指定创建内部静态类的方法名,默认值为 builder

1.2.5 builderClassName

指定内部静态的类名,默认值为 “”,默认创建的类名为 thisclassBuilder

这个我不太懂,不知道怎么演示

1.2.6 access

设置 builderMethodName 的访问权限修饰符,默认为 public

共有 PUBLIC、MODULE、PROTECTED、PACKAGE、PRIVATE,其中 MODULE 是 Java 9 的新特性

access = AccessLevel.PUBLIC

1.2.7 setterPrefix

设置 setter 方法的前缀,默认为 “”

1.3 处理添加无参构造函数报错时报错


@Builder 会生成一个全参构造方法,因此就没有了无参构造方法,但当我们遇到需要无参构造方法时就会发生问题,这个时候手写或者加上 @NoArgsConstructor 都会报错

1.3.1 处理方案1

加上 @AllArgsConstructor

1.3.2 处理方案2

使用 @Builder 对一个 DTO 实现一个构造器,但是在做 Json 反序列化的时候发生错误,原因就是缺少无参公共的构造函数,而手动写一个无参构造函数的时候编译错误,就是和 @Builder 冲突

虽然标准的 @Builder 没法是需要私有化构造函数的,但是在某些场景下我们需要对这种标准变形,这个时候 lombok 提供了 @Tolerate 实现对冲突的兼容

使用@Tolerate注解

我们手动添加一个无参构造函数,但是当运行之后就会出现错误

但是当我们在无参构造函数上添加@Tolerate注解之后就可以正常运行

1.4 @Builder内部


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

  • 在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性

  • 在构建器中:创建一个无参的 default 构造函数

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

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

  • 在构建器中:会生成一个 toString 方法

  • 在实体类中:会创建一个 builder 方法,它的目的是用来创建构建器

@Builder
publicclassUser {privateStringusername;privateStringpassword;
}

publicclassUser {privateStringusername;privateStringpassword;
​
​User(Stringusername, Stringpassword) {this.username=username;this.password=password;}//  在实体类中会创建一个 builder 方法,它的目的是用来创建构建器publicstaticUser.UserBuilderbuilder() {returnnewUser.UserBuilder();}
//  构建器publicstaticclassUserBuilder {//在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性privateStringusername;privateStringpassword;//在构建器中:创建一个无参的 default 构造函数UserBuilder() {}
​//在构建器中:实体类中的每个参数,都会对应创建类似于 setter 的方法,方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用)        publicUser.UserBuilderusername(Stringusername) {this.username=username;returnthis;}
​publicUser.UserBuilderpassword(Stringpassword) {this.password=password;returnthis;}//在构建器中:会创建一个 build 方法,调用 build 方法,就会根据设置的值进行创建实体对象publicUserbuild() {returnnewUser(this.username, this.password);}//在构建器中:会生成一个 toString 方法 publicStringtoString() {return"User.UserBuilder(username="+this.username+", password="+this.password+")";}}
}   

相关内容

热门资讯

模拟安卓系统软件,软件功能与体... 你有没有想过,手机里的世界可以变得更加丰富多彩?没错,就是那种可以像安卓系统一样自由自在地玩耍的世界...
安卓换系统会卡吗,换系统会卡吗... 你有没有想过,你的安卓手机用久了,是不是也会像人一样,反应变得迟钝了呢?没错,这就是我们今天要探讨的...
平板安卓系统自动重启,安卓平板... 你是不是也遇到过这种情况?平板电脑突然间就自动重启了,是不是瞬间感觉心里一紧,心想这可怎么办呢?别急...
findx3安卓系统,安卓系统... 你有没有发现,最近手机圈里又掀起了一股热潮?没错,就是OPPO Find X3系列的安卓系统。这款系...
安卓系统删除的软件,那些曾陪伴... 手机里的软件越来越多,是不是有时候觉得内存不够用,想清理一下呢?别急,今天就来聊聊安卓系统删除软件的...
白色的手机安卓系统,安卓系统下... 你有没有发现,最近市面上那些白色的手机简直让人眼前一亮呢?尤其是搭载安卓系统的那些,简直就像是一块块...
vico是不是安卓系统,揭秘安... 最近是不是有很多小伙伴在问:“Vico手机,它是不是运行安卓系统呢?”这个问题可真是让人好奇啊!今天...
安卓10系统省电不,安卓10系... 你有没有发现,自从升级到安卓10系统,手机续航能力好像大不如前了?别急,今天就来给你揭秘安卓10系统...
cm14安卓系统,深度定制与极... 你有没有发现,你的安卓手机最近是不是有点不一样了?是不是觉得系统运行得更加流畅,界面也更加美观了呢?...
平板安卓系统咋样升级,轻松实现... 你那平板安卓系统是不是有点儿卡,想给它来个升级大变身?别急,让我来给你详细说说平板安卓系统咋样升级,...
安卓原系统在哪下载,探索纯净体... 你有没有想过,为什么安卓手机那么受欢迎?那是因为它的系统——安卓原系统,它就像是一个充满活力的魔法师...
安卓系统procreate绘图... 你有没有发现,现在手机上画画变得越来越流行了?尤其是用安卓系统的手机,搭配上那个神奇的Procrea...
电视的安卓系统吗,探索安卓电视... 你有没有想过,家里的电视是不是也在悄悄地使用安卓系统呢?没错,就是那个我们手机上常用的安卓系统。今天...
苹果手机系统操作安卓,苹果iO... 你有没有发现,身边的朋友换手机的时候,总是对苹果和安卓两大阵营争论不休?今天,咱们就来聊聊这个话题,...
安卓系统换成苹果键盘,键盘切换... 你知道吗?最近我在想,要是把安卓系统的手机换成苹果的键盘,那会是怎样的体验呢?想象那是不是就像是在安...
小米操作系统跟安卓系统,深度解... 亲爱的读者们,你是否曾在手机上看到过“小米操作系统”和“安卓系统”这两个词,然后好奇它们之间有什么区...
miui算是安卓系统吗,深度定... 亲爱的读者,你是否曾在手机上看到过“MIUI”这个词,然后好奇地问自己:“这玩意儿是安卓系统吗?”今...
安卓系统开机启动应用,打造个性... 你有没有发现,每次打开安卓手机,那些应用就像小精灵一样,迫不及待地跳出来和你打招呼?没错,这就是安卓...
小米搭载安卓11系统,畅享智能... 你知道吗?最近小米的新机子可是火得一塌糊涂,而且听说它搭载了安卓11系统,这可真是让人眼前一亮呢!想...
安卓2.35系统软件,功能升级... 你知道吗?最近在安卓系统界,有个小家伙引起了不小的关注,它就是安卓2.35系统软件。这可不是什么新玩...