使用Lombok中的@Builder代替传统对象赋值

Posted 田间稻草人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Lombok中的@Builder代替传统对象赋值相关的知识,希望对你有一定的参考价值。

传统给对象赋值,之前都是这么写

User user = new User();
user.setReceiver("zengwei");
user.setQq("1014483974");
user.setEmail("1014483974@qq.com");
user.setWork("Java");

之后在网上看到一段链式结构的写法

User user = User.builder()
		.receiver("zengwei")
		.qq("1014483974")
		.email("1014483974@qq.com")
		.work("java")
		.build();

链式结构写法比传统写法要优雅,而且减少了冗余代码,通过lombok中的@Builder注解即可实现。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

@Builder使用了构造者模式,屏蔽了里面的构造细节。

缺点

  1. 使用构建器的时候,必须利用另外一个类来实例化另外一个类,这样子会使创建的时候创建更多的对象,很明显额外占用了内存。
  2. 子类Builder对象无法修改父类的属性

当需要修改原对象的属性值,需要在@Builder注解后加上toBuilder = true

@Builder(toBuilder = true)

能日赚30手赚试玩平台,亲测有效

使用toBuilder()对其修改赋值

// 能日赚30手赚试玩平台,推荐使用iphone操作 
// https://mp.weixin.qq.com/s?__biz=MzIyODgxNjkyOQ==&mid=100000040&idx=1&sn=47c0245f9dbe70f3ad6b2540209af2c2&chksm=684d60665f3ae97095ba07d8c6804bac4f55dbc6e7100fbb233945f65364df88682d41332eb7&xtrack=1&scene=0&subscene=10000&clicktime=1616647421&enterid=1616647421&ascene=7&devicetype=android-29&version=28000165&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=AdxLWFyJlgtM6uFZCpgWtBk%3D&pass_ticket=G8rEeGdox4FPpICRkrKy6ho2QZozCzXi%2Be7gV5bXnQaXoZK2pw4S8Wf2j%2Bt3D8mi&wx_header=1
user = user.toBuilder()
	   .receiver("zengwei")
	   .qq("1014483974")
	   .email("1014483974@qq.com")
	   .work("java开发")
	   .build();

当实体报错 Class \'User\' should have public no-arg constructor,提示缺少无参构造函数,当加上无参构造函数后,运行还是报错,原因是和@Builder冲突了,Lombok提供了@Tolerate注解对冲突进行兼容

@Tolerate
public User() {
}

实体对象类(完整)


/**
 * @Author: zengwei
 * @Email: 1014483974@qq.com
 * 能日赚30手赚试玩平台,推荐使用iphone操作 
 * https://mp.weixin.qq.com/s?__biz=MzIyODgxNjkyOQ==&mid=100000040&idx=1&sn=47c0245f9dbe70f3ad6b2540209af2c2&chksm=684d60665f3ae97095ba07d8c6804bac4f55dbc6e7100fbb233945f65364df88682d41332eb7&xtrack=1&scene=0&subscene=10000&clicktime=1616647421&enterid=1616647421&ascene=7&devicetype=android-29&version=28000165&nettype=WIFI&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=AdxLWFyJlgtM6uFZCpgWtBk%3D&pass_ticket=G8rEeGdox4FPpICRkrKy6ho2QZozCzXi%2Be7gV5bXnQaXoZK2pw4S8Wf2j%2Bt3D8mi&wx_header=1
 */
@Data
@Builder(toBuilder = true)
@EqualsAndHashCode(callSuper = false)
public class User() {
	
	@Tolerate
	public User() {
	}
	
	private String receiver;
	private String qq;
	private String email;
	private String work;
	
}

未经允许,禁止转载

知识共享许可协议
本作品采用知识共享署名 4.0 国际许可协议进行许可。

以上是关于使用Lombok中的@Builder代替传统对象赋值的主要内容,如果未能解决你的问题,请参考以下文章

Lombok中的@Builder注解的使用

还在手写 Builder 模式?试试 Lombok 中的 @Builder 用法,太强了!

还在手写 Builder 模式?试试 Lombok 中的 @Builder 用法,太强了。。

还在手写 Builder 模式?试试 Lombok 中的 @Builder 用法,太强了。。

lombok的@builder 不能新建DO对象 Lombok存在的一些问题

使用Lombok @Builder注解导致默认值无效