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

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

时间:2022-10-11 22:00:06

相关推荐

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

点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试资料

作者: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{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 建个对象吧~

热门内容:

大批 IDEA 激活码到期之后的乱象...

全面了解 Nginx 主要应用场景

为什么微服务一定要有网关?

那些在一个公司死磕了5-的人,最后都怎么样了?

只有程序员才能读懂的西游记

,搞个 Mac 玩玩!

分布式与集群的区别究竟是什么?

碰到Maven依赖冲突,想砸电脑?这个IDEA插件必须了解一下...

Java框架排行榜,谁居榜首?

SpringBoot+RabbitMQ ,保证消息100%投递成功并被消费(附源码)

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。

获取方式:点“在看”,关注公众号并回复666领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

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