java同一对象new多次,你还在new对象吗?Java8通用Builder了解一下?

你还在new对象吗?Java8通用Builder了解一下?

你还在new对象吗?Java8通用Builder了解一下?

你来,我们一起精进!你不来,我和你的竞争对手一起精进!

你还在new对象吗?Java8通用Builder了解一下?

程序员经常会遇到灵魂拷问:你有对象吗?

没有,但我可以 new 一个!

public class GirlFriend {

private String name;

private int age;

// 省略 getter & setter ...

public static void main(String[] args) {

GirlFriend myGirlFriend = new GirlFriend();

myGirlFriend.setName("业余草");

myGirlFriend.setAge(18);

}

}

没问题,老铁!但如果对象的属性太多,咋办?

public class GirlFriend {

private String name;

private int age;

private int bust;

private int waist;

private int hips;

private List hobby;

private String birthday;

private String address;

private String mobile;

private String email;

private String hairColor;

private Map gift;

// 等等等等 ...

// 省略 getter & setter ...

public static void main(String[] args) {

GirlFriend myGirlFriend = new GirlFriend();

myGirlFriend.setName("业余草");

myGirlFriend.setAge(18);

myGirlFriend.setBust(33);

myGirlFriend.setWaist(23);

myGirlFriend.setHips(33);

myGirlFriend.setBirthday("2020-10-29");

myGirlFriend.setAddress("业余草科技大厦");

myGirlFriend.setMobile("18688888888");

myGirlFriend.setEmail("[email protected]");

myGirlFriend.setHairColor("浅棕色格子衫");

List hobby = new ArrayList<>();

hobby.add("写bug");

hobby.add("改bug");

hobby.add("背锅");

myGirlFriend.setHobby(hobby);

Map gift = new HashMap<>();

gift.put("情人节礼物", "机械键盘");

gift.put("生日礼物", "格子衫");

gift.put("纪念日礼物", "防脱发洗发精");

myGirlFriend.setGift(gift);

// 等等等等 ...

}

}

很好办,使用 Lombok 的 @Accessors(chain = true) 就可以简化一下了!

@Data

@Accessors(chain = true)

public class GirlFriend {

private String name;

private int age;

private int bust;

private int waist;

private int hips;

private List hobby;

private String birthday;

private String address;

private String mobile;

private String email;

private String hairColor;

private Map gift;

// 等等等等 ...

// 省略 getter & setter ...

public static void main(String[] args) {

GirlFriend myGirlFriend = new GirlFriend();

myGirlFriend.setName("业余草")

.setAge(18)

.setBust(33)

.setWaist(23)

.setHips(33)

.setBirthday("2020-10-29")

.setAddress("业余草科技大厦")

.setMobile("18688888888")

.setEmail("[email protected]")

.setHairColor("浅棕色格子衫");

List hobby = new ArrayList<>();

hobby.add("写bug");

hobby.add("改bug");

hobby.add("背锅");

myGirlFriend.setHobby(hobby);

Map gift = new HashMap<>();

gift.put("情人节礼物", "机械键盘");

gift.put("生日礼物", "格子衫");

gift.put("纪念日礼物", "防脱发洗发精");

myGirlFriend.setGift(gift);

// 等等等等 ...

}

}

上面的代码在类上加了 @Accessors(chain = true) 注解后,生成后的 set 方法返回值并不是 void,而是 this。

15a4b6ae9d2ecd9e0b1ad70fd4188722.png

使用 @Accessors(chain = true) 之后看起来是很美,但写起来也麻烦。而且呢,不少人使用 Lombok 翻过车,详情看这篇文中《记一次使用 Lombok 翻车造成的事故!》。况且,后面还有 jdk11 。。。

但是你也别慌,看法宝~

这里不再介绍其他 Builder 实现方式,直接祭出最实用的通用Builder:

适用于所有类,不需要改造原来类,不需要 lombok 插件支持。

先看看使用姿势:

public class GirlFriend {

// 省略属性 ...

// 省略 getter & setter ...

// 为了演示方便,加几个聚合方法

public void addHobby(String hobby) {

this.hobby = Optional.ofNullable(this.hobby).orElse(new ArrayList<>());

this.hobby.add(hobby);

}

public void addGift(String day, String gift) {

this.gift = Optional.ofNullable(this.gift).orElse(new HashMap<>());

this.gift.put(day, gift);

}

public void setVitalStatistics(int bust, int waist, int hips) {

this.bust = bust;

this.waist = waist;

this.hips = hips;

}

public static void main(String[] args) {

GirlFriend myGirlFriend = Builder.of(GirlFriend::new)

.with(GirlFriend::setName, "小美")

.with(GirlFriend::setAge, 18)

.with(GirlFriend::setVitalStatistics, 33, 23, 33)

.with(GirlFriend::setBirthday, "2001-10-26")

.with(GirlFriend::setAddress, "上海浦东")

.with(GirlFriend::setMobile, "18688888888")

.with(GirlFriend::setEmail, "[email protected]")

.with(GirlFriend::setHairColor, "浅棕色带点微卷")

.with(GirlFriend::addHobby, "逛街")

.with(GirlFriend::addHobby, "购物")

.with(GirlFriend::addHobby, "买东西")

.with(GirlFriend::addGift, "情人节礼物", "LBR 1912女王时代")

.with(GirlFriend::addGift, "生日礼物", "迪奥烈焰蓝金")

.with(GirlFriend::addGift, "纪念日礼物", "阿玛尼红管唇釉")

// 等等等等 ...

.build();

}

}

看到了吗!实例化和属性设置在同一条语句执行,链式操作,一路点点点,清爽!

Talk is cheap, show me the code:

/**

* 通用的 Builder 模式构建器

*/

public class Builder {

private final Supplier instantiator;

private List> modifiers = new ArrayList<>();

public Builder(Supplier instantiator) {

this.instantiator = instantiator;

}

public static  Builder of(Supplier instantiator) {

return new Builder<>(instantiator);

}

public  Builder with(Consumer1 consumer, P1 p1) {

Consumer c = instance -> consumer.accept(instance, p1);

modifiers.add(c);

return this;

}

public  Builder with(Consumer2 consumer, P1 p1, P2 p2) {

Consumer c = instance -> consumer.accept(instance, p1, p2);

modifiers.add(c);

return this;

}

public  Builder with(Consumer3 consumer, P1 p1, P2 p2, P3 p3) {

Consumer c = instance -> consumer.accept(instance, p1, p2, p3);

modifiers.add(c);

return this;

}

public T build() {

T value = instantiator.get();

modifiers.forEach(modifier -> modifier.accept(value));

modifiers.clear();

return value;

}

/**

* 1 参数 Consumer

*/

@FunctionalInterface

public interface Consumer1 {

void accept(T t, P1 p1);

}

/**

* 2 参数 Consumer

*/

@FunctionalInterface

public interface Consumer2 {

void accept(T t, P1 p1, P2 p2);

}

/**

* 3 参数 Consumer

*/

@FunctionalInterface

public interface Consumer3 {

void accept(T t, P1 p1, P2 p2, P3 p3);

}

}

这个示例最多支持三个参数的设置属性方法,也完全够用了。如果要扩展也很容易,依葫芦画瓢,添加多个参数的 Consumer。

这样,就又可以在同事面前装 X 了。怎么样,学到了吗?快使用本文的 Builder 建个对象吧~

你还在new对象吗?Java8通用Builder了解一下?相关教程

JS面向对象中的原型

JS面向对象中的原型 原型是什么 在JavaScript中,函数是一个包含属性和方法的Function类型的对象。而原型(Prototype)就是Function类型对象的一个属性。 在函数定义时就包含了prototype属性,它的初始值是一个空对象。在JavaScript中并没有定义函数的原型类

Request请求对象应用(请求转发和获取参数)

Request请求对象应用(请求转发和获取参数) 请求和响应是对立关系。这篇技术博客主要讲解请求对象: HttpServletRequest 该对象代表 客户端请求 。用户通过http协议访问服务器,Http请求中的所有信息会被封装到 HttpServletRequest中。通过这个对象的方法可

【C++】类与对象及this指针

【C++】类与对象及this指针 目录 一、类的引入 1、类的引入 二、类的定义 三、类的访问限定符 四、类的作用域 五、类的实例化 六、类对象的大小(占据的字节数)及存储方式 1、如何计算类对象的大小 2、类对象的存储方式 七、this指针 1、this指针的引用 2、t

2.js原形链及es6面向对象使用与原理深入浅出

2.js原形链及es6面向对象使用与原理深入浅出 文章目录 1. 重点提炼 2. 原型链 3. 构造函数的继承 4. 原型的继承 4.1 原型的深拷贝继承 4.2 组合继承 5. ES6中的类 5.1 类的写法(类不存在变量提升) 5.2 静态方法和属性 5.3 私有属性及公有属性 5.4 es6中的ge

使用FormData对象上传文件

使用FormData对象上传文件 使用FormData对象添加字段方式上传文件 html代码 div id=uploadForm input id=file type=file/ button id=upload type=buttonupload/button/div javascript代码 $('#upload').click(function() {var formData = new FormData();form

java对象

java对象 面向过程 面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二部做什么… 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类

MailSSLSocketFactory sf = new MailSSLSocketFactory();标红,

MailSSLSocketFactory sf = new MailSSLSocketFactory();标红,报错问题。 **问题描述: javaWeb写邮件发送,关于qq邮箱,还要设置ssl加密,但是 MailSSLSocketFactory sf = new MailSSLSocketFactory(); ***标红,报错。*** 环境设置: 1.jdk 1.82. mail-1.

中介者模式

中介者模式 一、中介者模式的介绍 中介者模式用一个中介对象封装一系列对象(同事)的交互,中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 中介者模式的角色划分: 抽象中介者角色(Mediator) :该角色定义出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值