当前位置: 首页 > news >正文

中山网站建设金科公司做网站找谁

中山网站建设金科,公司做网站找谁,城市建设杂志社网站,wordpress发外链该设计模式适用于创建复杂对象#xff0c;该复杂对象通常是由各个部分的子对象用一定的算法或者步骤构成#xff0c;针对每个子对象内部算法和步骤通常是稳定的#xff0c;但是该复杂对象的确实由于不同的需求而选择使用不同的子对象进行组装。对于构建该复杂的对象#xf…该设计模式适用于创建复杂对象该复杂对象通常是由各个部分的子对象用一定的算法或者步骤构成针对每个子对象内部算法和步骤通常是稳定的但是该复杂对象的确实由于不同的需求而选择使用不同的子对象进行组装。对于构建该复杂的对象通常可以使用builder设计模式。而对于kotlin语言结合高阶函数所实现的建造者设计模式算是DSL代码分享的实践。 比如我们如果想要创建一个Server类 class Server() {var port: Intvar address: String... }但是考虑到创建该对象比较复杂该对象的成员比较多且每一个成员的最终取值需要一定的算法策略为了减少构造函数的参数我们采用为该类添加一个建造者类通过建造者类来创建该Server对象而不是直接new该对象为了在使用中我们直观感受到该建造者类是专门为Server类服务故我们将该建造者类声明为该Server的内部类。 class Server(val serverBuilder: ServerBuilder) {class ServerBuilder {private var port: Int 8080private var address: String fun port(init: ServerBuilder.() - Int) apply { port init() }fun address(init: ServerBuilder.() - String) apply { address init() }fun build(): Server Server(this)} }我们仔细观察下这个建造者类ServerBuilder因为我们是要该类帮我们最终构建Server类那么我们就要求Server Builder要包含Server应该包含的所有的成员port、address等且这些成员都要设置成可变的可重新被赋值的即var。 同时为这些成员都增加一个对应的方法方便从外部注入值。我们仔细观察下port和address方法以port方法为例address方法结构和port方法类似。 port方法的参数接收一个参数该参数是一个lambda表达式一个高阶函数该port的方法的返回值是apply的返回值而我们知道kotlin的apply方法一般是作用于一个对象的且最终的返回值就是这个对象很明显此处的apply方法省略了thisapply的返回值就是当前的ServerBuilder对象完成的写法应该是 this.apply {}其等价于 fun port(init: ServerBuilder.() - Int): ServerBuilder {init()return this }apply的内部则是将lambda的表达式的返回值赋值给了该ServerBuilder对象的port成员。我们再来看下port方法所接收的lambda表达式 ServerBuilder.() - Int注意看此处的ServerBuilder().是什么意思呢在kotlin中classname(). 常用于高阶函数中作为高阶函数的参数。 形如action: (Builder.() - Int) 表示的是Function literals with receiver这是一个方法该方法不接收任何参数该方法返回的是一个int并且该方法是由Builder对象触发。 其实按照如上的使用的时候Idea给我们的提示就可以看出通过将port方法的高阶函数定义为Builder.() - Int就相当于我们为port方法的上下文注入下this而该this就是当前的Builder对象。 最终使用的时候如下 val server Server.ServerBuilder().port {8080}.address { www.baidu.com}借助了apply方法我们可以实现链式调用因为port方法和address函数返回的都是builder对象但是我们观察这种写法还是不够DSL化为此我们给ServerBuilder添加一个构造方法 class ServerBuilder private constructor(){private var port: Int 8080private var address: String // 此处的this(), 表示次构造器要授权给主构造器constructor(init: ServerBuilder.() - Unit): this() { init()}fun port(init: () - Int) apply { port port2() }fun address(init: ServerBuilder.() - String) apply { address init() }fun build(): Server Server(this)}val server Server.ServerBuilder {}.port {8080}.address {www.baidu.com}也可以写成如下把port和address写入ServerBuilder的里面因为ServerBuilder的里面可以拿到this上线文故最终形态class Server private constructor(val port: Int,val address: String, ) {private constructor(builder: ServerBuilder): this(builder.port,builder.address)class ServerBuilder private constructor(){var port: Int 8080var address: String // 此处的this(), 表示次构造器要授权给主构造器constructor(init: ServerBuilder.() - Unit): this() { init()}fun port(init: () - Int) apply { port init() }fun address(init: ServerBuilder.() - String) apply { address init() }fun build(): Server Server(this)} }fun main() {val server Server.ServerBuilder {port {8080}address {www.baidu.com}}.build() }为了进一步DSL化也为了向外界屏蔽ServerBuilder对象我们可以给ServerBuilder添加静态方法 class Server private constructor(val port: Int,val address: String, ) {companion object {// inline fun build(block: ServerBuilder.() - Unit) Builder().apply(block).build()fun build(block: ServerBuilder.() - Unit) ServerBuilder {block()}.build()}private constructor(builder: ServerBuilder): this(builder.port,builder.address)class ServerBuilder private constructor(){var port: Int 8080var address: String // port方法的参数接收一个参数该参数是一个lambda表达式一个高阶函数该port的方法的返回值是//apply的返回值apply的返回值就是当前的ServerBuilder对象完成的写法应该是this.apply// apply的内部则是将lambda的表达式的返回值赋值给了该ServerBuilder对象的port成员// 此处的this(), 表示次构造器要授权给主构造器constructor(init: ServerBuilder.() - Unit): this() { init()}fun port(init: () - Int) apply { port init() }fun address(init: ServerBuilder.() - String) apply { address init() }fun build(): Server Server(this)} } //测试 fun main() {val server Server.build {port {8082}address {www.baidu.com}} }参考 https://stackoverflow.com/questions/44427382/what-does-mean-in-kotlin
http://www.w-s-a.com/news/784761/

相关文章:

  • 谁用fun域名做网站了网络营销的三种方式
  • 织梦网站上传天津网站建设电话咨询
  • 论坛网站搭建深圳网
  • 天津建立网站营销设计window7用jsp做的网站要什么工具
  • 英文网站wordpress所有图片
  • 我做的网站怎么打开很慢网络营销典型企业
  • 新增备案网站python3网站开发
  • 诊断网站seo现状的方法与通信工程专业做项目的网站
  • 南京 微网站 建站alexa排名查询统计
  • 天津网站建设企业系统wordpress已发布不显示不出来
  • 大连网站前端制作公司局域网视频网站建设
  • 张家界建设局网站电话wordpress网站怎么建
  • 淄博网站建设有实力装修培训机构哪家最好
  • 彩票网站建设seo优化师是什么
  • 怎么做英文网站网站建设基本费用
  • dede网站名称不能保存wordpress运费设置
  • 出口网站制作好一点的网站建设
  • 在小说网站做编辑怎么找韶关市建设局网站
  • 网站策划怎么做内容旅游型网站建设
  • 东莞百度网站推广ppt模板免费下载的网站
  • 网站建设项目管理基本要求网站空间到期影响
  • 做奖杯的企业网站谁有推荐的网址
  • wordpress能做企业站吗wordpress收发邮件
  • 电子产品网站建设策划方案腾讯企业邮箱注册申请免费
  • 哪些网站可以免费做代码自己电脑做网站服务器广域网访问
  • 高端网站设计青海省教育厅门户网站学籍查询
  • 长春网站优化公司网站制作400哪家好
  • 县级门户网站建设的报告开发游戏的软件有哪些
  • 做电子商务的网站wordpress带会员中心
  • 网站域名不变网站可以从做吗网站建设步骤 文档