失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 你还在 new 对象吗?Java8 通用 Builder 了解一下

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

时间:2019-12-17 05:36:56

相关推荐

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

微信搜索逆锋起笔关注后回复编程pdf

领取编程大佬们所推荐的 23 种编程资料!

作者:cipher

/java8-builder.html

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

没有,但我可以 new 一个!

publicclassGirlFriend{privateStringname;privateintage;//省略getter&setter...publicstaticvoidmain(String[]args){GirlFriendmyGirlFriend=newGirlFriend();myGirlFriend.setName("小美");myGirlFriend.setAge(18);}}

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

publicclassGirlFriend{privateStringname;privateintage;privateintbust;privateintwaist;privateinthips;privateList<String>hobby;privateStringbirthday;privateStringaddress;privateStringmobile;privateStringemail;privateStringhairColor;privateMap<String,String>gift;//等等等等...//省略getter&setter...publicstaticvoidmain(String[]args){GirlFriendmyGirlFriend=newGirlFriend();myGirlFriend.setName("小美");myGirlFriend.setAge(18);myGirlFriend.setBust(33);myGirlFriend.setWaist(23);myGirlFriend.setHips(33);myGirlFriend.setBirthday("2001-10-26");myGirlFriend.setAddress("上海浦东");myGirlFriend.setMobile("18688888888");myGirlFriend.setEmail("pretty-xiaomei@");myGirlFriend.setHairColor("浅棕色带点微卷");List<String>hobby=newArrayList<>();hobby.add("逛街");hobby.add("购物");hobby.add("买东西");myGirlFriend.setHobby(hobby);Map<String,String>gift=newHashMap<>();gift.put("情人节礼物","LBR1912女王时代");gift.put("生日礼物","迪奥烈焰蓝金");gift.put("纪念日礼物","阿玛尼红管唇釉");myGirlFriend.setGift(gift);//等等等等...}}

GirlFriend

GirlFriend{name='小美',age=18,bust=33,waist=23,hips=33,hobby=[逛街,购物,买东西],birthday='2001-10-26',address='上海浦东',mobile='18688888888',email='pretty-xiaomei@',hairColor='浅棕色带点微卷',gift={情人节礼物=LBR1912女王时代,生日礼物=迪奥烈焰蓝金,纪念日礼物=阿玛尼红管唇釉}}

GirlFriend 是很美,但写起来也太麻烦了吧。

说说缺点:实例化和设置属性分开,不好维护;变量名重复写。

莫慌,看法宝~

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

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

先看看使用姿势:

publicclassGirlFriend{//省略属性...//省略getter&setter...//为了演示方便,加几个聚合方法publicvoidaddHobby(Stringhobby){this.hobby=Optional.ofNullable(this.hobby).orElse(newArrayList<>());this.hobby.add(hobby);}publicvoidaddGift(Stringday,Stringgift){this.gift=Optional.ofNullable(this.gift).orElse(newHashMap<>());this.gift.put(day,gift);}publicvoidsetVitalStatistics(intbust,intwaist,inthips){this.bust=bust;this.waist=waist;this.hips=hips;}publicstaticvoidmain(String[]args){GirlFriendmyGirlFriend=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,"pretty-xiaomei@").with(GirlFriend::setHairColor,"浅棕色带点微卷").with(GirlFriend::addHobby,"逛街").with(GirlFriend::addHobby,"购物").with(GirlFriend::addHobby,"买东西").with(GirlFriend::addGift,"情人节礼物","LBR1912女王时代").with(GirlFriend::addGift,"生日礼物","迪奥烈焰蓝金").with(GirlFriend::addGift,"纪念日礼物","阿玛尼红管唇釉")//等等等等....build();}}

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

Talk is cheap, show me the code:

/***通用的Builder模式构建器**@author:CipherCui*@since/8/29*/publicclassBuilder<T>{privatefinalSupplier<T>instantiator;privateList<Consumer<T>>modifiers=newArrayList<>();publicBuilder(Supplier<T>instantiator){this.instantiator=instantiator;}publicstatic<T>Builder<T>of(Supplier<T>instantiator){returnnewBuilder<>(instantiator);}public<P1>Builder<T>with(Consumer1<T,P1>consumer,P1p1){Consumer<T>c=instance->consumer.accept(instance,p1);modifiers.add(c);returnthis;}public<P1,P2>Builder<T>with(Consumer2<T,P1,P2>consumer,P1p1,P2p2){Consumer<T>c=instance->consumer.accept(instance,p1,p2);modifiers.add(c);returnthis;}public<P1,P2,P3>Builder<T>with(Consumer3<T,P1,P2,P3>consumer,P1p1,P2p2,P3p3){Consumer<T>c=instance->consumer.accept(instance,p1,p2,p3);modifiers.add(c);returnthis;}publicTbuild(){Tvalue=instantiator.get();modifiers.forEach(modifier->modifier.accept(value));modifiers.clear();returnvalue;}/***1参数Consumer*/@FunctionalInterfacepublicinterfaceConsumer1<T,P1>{voidaccept(Tt,P1p1);}/***2参数Consumer*/@FunctionalInterfacepublicinterfaceConsumer2<T,P1,P2>{voidaccept(Tt,P1p1,P2p2);}/***3参数Consumer*/@FunctionalInterfacepublicinterfaceConsumer3<T,P1,P2,P3>{voidaccept(Tt,P1p1,P2p2,P3p3);}}

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

快用你的 Builder 建个对象吧~

逆锋起笔是一个专注于程序员圈子的技术平台,你可以收获最新技术动态最新内测资格BAT等大厂大佬的经验增长自身学习资料职业路线赚钱思维,微信搜索逆锋起笔关注!

Java 程序员常犯的 10 个 SQL 错误!

Java 全套视频教程

Java 初级和高级面试知识点准备

进阶必备!35 个 Java 代码优化细节

Java 9 到 16 新特性总结大全!

点赞是最大的支持

如果觉得《你还在 new 对象吗?Java8 通用 Builder 了解一下》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。