Java和Python中类似Kotlin的生成器,续:附加参数

介绍

在今天的文章中,我们将继续上周的文章,内容涉及用Java和Python制作类似于Kotlin的构建器,扩展构建器API以采用一些可选参数来提高灵活性。 我们继续我们HTML示例,尝试添加标记属性,例如类,id和样式。

Kotlin和Python

Kotlin设置这些参数的用法的方式与我在Python中的使用方式完全相同:默认参数和命名参数。 使用Kotlin看起来像这样:

html {body {p(klass="myClass", id="theParagraph") {+ "the paragraph text"}}
}

请注意,使用“杯子”而不是“类”。 关键字和标识符的经典冲突。 您可以根据需要使用“ cls”,“ clazz”或其他任何东西。 我建议不要使用类对象语言中通常使用的任何东西,因为这是完全不同的类。

与上周的p标签相比,这是一个很大的升级(只是p = "text" ),将其从属性更改为成熟的方法。 但是大多数其他示例不需要太多工作。 这是更新的Kotlin代码:

class Body {...fun p(class: String="", id: String="", style: Style=Style.blank, paragraphBuilder: Paragraph.() -> Unit) {val p = Paragraph(class, id, style)paragraphs.add(p)p.paragraphBuilder()}...
}class Paragraph(val class: String, val id: String, val style: Style) {var text: String = ""operator fun plus(other: String) {text += other}
}

更新后的Python代码(仍使用第一个版本)如下所示:

class Body:def __init__(self):self.paragraphs = ...def p(self, klass='', id='', style=None):par = Paragraph(klass, id, style)self.paragraphs.append(par)return parclass Paragraph:def __init__(self, klass, id, style):self.klass = klassself.id = idself.style = styleself.text = ''def __enter__(self):return selfdef __exit__(self, exc_type, exc_val, exc_tb):return Falsedef __iadd__(self, text):self.text += text

__iadd__()是就地加法运算符,允许我们说p += 'text' 。 在Kotlin中,我们使用+而不是+=因为我们不必引用段落对象,因此以+=开头似乎是错误的,而我们需要在Python代码中引用p ,因此+=看起来更自然,这样,我们就可以将调用代码更改为以下形式:

html = Html()
with html as html:with html.body() as body:with body.p(class='myClass', id='theParagraph') as p:p += 'the paragraph text'

Kotlin和Python都采用Style对象,而不是像其他字符串一样仅接受另一个字符串。 实际上,我建议也对class和id做同样的事情,因为从那时起,我们将class和id对象及其CSS设置传递给CSS生成器。 我只是为了举例而没有在这里做。 我不让Style保留字符串,因为最好使用某种CSS样式生成器来提供更好的清晰度和正确性。

Java

Kotlin和Python都使过渡非常简单。 不幸的是,Java没有设置必需的功能来进行如此简单的更改。 您必须依靠古老的流利的API技巧来使您顺利通过。

重载嘉豪!

首先想到的是尽可能多地进行带有大量重载的转换。 您可以为class和id字段创建快速,方便的字符串包装器,因为它们都只是字符串,因此很难区分两者:

class Class {public final String text;public Class(String text) {this.text = text;}
}class ID {public final String text;public ID(String text) {this.text = text;}
}

这使得所有重载看起来像这样:

class Body {...public void p(Consumer<Paragraph> paragraphBuilder) {...}public void p(Class klass, Consumer...) {...}public void p(ID id, Consumer...) {...}public void p(Style style, Consumer...) {...}public void p(Class klass, ID id, Consumer...) {...}// and so on... 3 more times...
}

这变得非常乏味,以至于我什至没有写完每一行,更不用说开始所有行了。 而且这仅考虑了类,id和样式。 还有更多。 走这条路是不好的。 因此,我什至不会显示结果代码的样子。 另外,对于其余的想法,我不会费心地展示API的实现,希望它是不言而喻的。 如果您真的对如何实现一种API感到好奇,请告诉我。

内部设定

设置这些属性的另一种方法是在构建器中进行设置。 提供用于设置这些值的“ Paragraph方法。 在body标签内看起来像这样:

html.body(body -> {body.p(p -> { p.klass = "myClass"; p.id = "theParagraph";p.addText("the paragraph text");});
});

这并不可怕(尤其是在第一行上有那些设置程序行;将它们放在后续行上会混淆其目的),并且这可能是最简单的,但是错误代码的可能性却很高:

html.body(body -> {body.p(p -> {p.klass = "myClass";p.addText("the paragraph text");p.id = "theParagraph";});
});

让我们看看其他选项。

属性对象

仅使用p()两个重载(一个仅接受构建器函数,而一个重载并与Attributes对象一起),我们可以制作一个非常干净的API,看起来像这样:

html.body(body -> {body.p(Attributes.klass("myClass").id("theParagraph"), p -> {p.addText("the paragraph text");});
});

就个人而言,这是我的最爱。 它需要更多的类和更多的实际复杂性,但是我觉得它是最可扩展的。 最大的不便是不同HTML标签具有不同的属性集。 可能应该有一个公共的“ Attributes构建器类,再加上一个特定于标记的类,从而使重载次数最多达到4(没有属性,只有基本的属性,只有特定于标记的属性,以及这两种类型)。 四个重载是可以容忍的,但可能不应该。 如果看起来太多,最好还是坚持最后一种策略。

为了完整起见,我还有一个,它实际上可能对其他不模仿HTML或XML的API更好地工作。

通话后大楼

最后一个想法是让Body.p()返回Paragraph (最好是构建器的第二阶段,因为这些方法可以在构建器lambda中使用,否则可以)调用这些方法,如下所示:

html.body(body -> {body.p(p -> {p.addText("the paragraph text");}).klass("myClass").id("theParagraph");
});

这实际上将Attributes类移到末尾,作为“ Paragraph构建器的第二阶段。

奥托罗

那是我能给你的最好的。 如果您有兴趣使用Java之类的语言来构建流畅的API,则应查阅jOOQ的文章,了解它们的用法 。 这是一种完全不考虑lambda的不同方式,这很好。 无论如何,下周我将发表一系列简短的书评文章时,我将与你们交谈。

翻译自: https://www.javacodegeeks.com/2016/01/kotlin-like-builders-java-python-continued-additional-parameters.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/355883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vs2015 html页面没有试图,vs2015 web设计视图假死,求帮助

你好&#xff0c;首先&#xff0c;请在发送一个请求去验证你的MSDN账号。然后&#xff0c;从你的描述来看&#xff0c;即使创建新项目&#xff0c;VS的design界面出现不了还是你的VS安装有问题。我们可以从两方面考虑&#xff1a;1.系统环境建议你检查一下Windows系统更新&…

nodejs 之 nvm和pm2

说道 node不得不提到nodejs的版本管理nvm和Node应用的进程管理器pm2。 当然&#xff0c;关于这两个的介绍的文章那么多&#xff0c;随意baidu,bing,google就可以。 我这里是给自己打一个标签&#xff0c;方便日后 查询&#xff0c; 二是方便一些和我一样的小白&#xff0c;能速…

2021上饶市高考中考成绩查询,2021年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口...

2018年上饶中考成绩公布查询时间 上饶中考成绩查询方式入口2018年上饶高考结束了&#xff0c;可是上饶中考又来了!6月注定是一个不平淡的月份。又一大批孩子朝着青春出发踏着坚定的脚步&#xff0c;行走在如火的六月。宁静的清晨&#xff0c;静谧的夜&#xff0c;那条反反复复走…

vue 实例化几种方式_vue注册组件的几种方式总结

vue注册组件的几种方式总结 1、全局注册(这种方式注册组件必须在vue实例化之前声明) Vue.component(tag-name,{}) 2、局部注册 var Child = {template: A custom component! } new Vue({// ... components: {// 将只在父模板可用 my-component: Child } }) 3、扩展实例 // 定…

gson json和类转换_带有GSON和抽象类的JSON

gson json和类转换经过多年使用org.json库在Java中支持JSON数据交换格式后&#xff0c;我已切换到Google Gson 。 org.json是一个较低层的库&#xff0c;因此您必须创建JSONObject&#xff0c;JSONArray&#xff0c;JSONString等…并执行其他低层工作。 Gson简化了这项工作。 它…

自考18年4月计算机应用基础,2019年自学考试计算机应用基础试题(18)

2019年4月自考报名已经拉开序幕&#xff0c;同学们可以开始准备自考复习&#xff0c;下面是2019年自学考试计算机应用基础试题(18)&#xff0c;了解更多自学考试资讯请锁定自学考试网&#xff0c;更有海量模拟试题&#xff0c;精品复习资料等你来下载!1.Windows 中删除文件夹的…

git中文件的三种状态

用xcode的时候&#xff0c;左侧栏文件的邮右边时不时会看到M&#xff0c;A这一类的字母。当然&#xff0c;这些以后再写上。先说一下git里文件的三种状态 已提交&#xff08;committed&#xff09; 已经提交的本地仓库&#xff08;repository&#xff09;&#xff0c;需要手动…

创建一个带参数的formgoup_gin框架如何获取带文件的formData请求?

**前端代码如下**function upFile() {var formData new FormDatavar file document.getElementById("upload").files[0]var text document.getElementById("text").valueformData.append("upload",file)formData.append("text",tex…

如何从URL查询字符串获得/附加视图参数(示例)?

让我们剖析几个简单的用例&#xff0c;并查看视图参数的工作原理&#xff08;视图参数名称不是强制性的&#xff0c;以匹配通过URL查询字符串传递的请求参数&#xff0c;但在本文中&#xff0c;我们将重点讨论这种情况&#xff09;&#xff1a; 情况1 在index.xhtml页面中&…

桌面怎么设置 计算机 网络,Win10 10130桌面电脑网络图标怎么设置?

越来越多朋友的计算机安装Windows10系统&#xff0c;现在Windows10系统已经升级到10130版&#xff0c;我的计算机升级到了10130版。安装Windows10的10130版系统后&#xff0c;桌面只有回收站和软媒的图标&#xff0c;如何把电脑、网络、用户的文件、控制面板等图标设置到桌面上…

swift 打开第三方应用_iOS卡通人物帧动画入门9(大结局):番外篇-扩展第三方类

扩展第三方类细心的朋友可能会发现&#xff0c;我们前面计算主角的大小用的总是同一方向第一帧纹理的大小&#xff0c;如果纹理大小有出入的话&#xff0c;会产生较大的偏差&#xff0c;最好的方法是取当前动画帧纹理的大小。不过这有些难度&#xff0c;所以我们退之求其次&…

awk说明书(转)

ref&#xff1a;http://blog.chinaunix.net/uid-429659-id-122573.html awk使用手册 作者&#xff1a;awk使用手册什么是awk? 你可能对UNIX比较熟悉&#xff0c;但你可能对awk很陌生&#xff0c;这一点也不奇怪&#xff0c;的确&#xff0c;与其优秀的功能相比&#xff0c;awk…

jpa jdbc jndi_没有J2EE容器的JNDI和JPA

jpa jdbc jndi我们希望通过尽可能简单的设置来测试一些JPA代码。 计划仅使用Java和Maven&#xff0c;不使用应用程序服务器或其他J2EE容器。 我们的JPA配置需要两件事才能成功运行&#xff1a; 数据库来存储数据&#xff0c; JNDI访问数据库。 这篇文章分为两个部分。 第一部…

本科计算机应用水平,湖南工程学院全日制非计算机专业本科生参加湖南省计算机应用水平等级考试的规定...

根据省教育厅《关于印发湖南省普通高等学校非计算机专业学生计算机应用水平等级考试大纲的通知》(湘教发〔2012〕58号)精神&#xff0c;经研究&#xff0c;现对我校全日制非计算机专业本科生参加计算机等级考试有关事项作如下规定&#xff1a;1&#xff0e;凡我校全日制非计算机…

Linux umask限制导致php的mkdir 0777无效

原因:mkdir权限受当前linux umask限制 解决方法: 1 $oldmask umask(0); 2 mkdir("test", 0777); 3 umask($oldmask); 参考SO:http://stackoverflow.com/a/3997671/4009148转载于:https://www.cnblogs.com/gy1010/p/6674243.html

cstringw转lpctstr_新手必看:CString 和 LPCTSTR等之间的转换大全 | 求索阁

CString 和 LPCTSTR 可以说通用。 原因在于CString定义的自动类型转换&#xff0c;没什么奇特的&#xff0c;最简单的C操作符重载而已。常量字符串ansi和unicode的区分是由宏_T来决定的。但是用_T( "abcd ")时&#xff0c; 字符串 "abcd "就会根…

vue如何过滤html标签,去除富文本中的html标签及vue、react、微信小顺序中的过滤器...

在猎取富文本后&#xff0c;又只需显现部分内容&#xff0c;须要去除富文本标签&#xff0c;然后再截取个中一部分内容&#xff1b;然后就是过滤器&#xff0c;在微信小顺序中运用照样挺屡次的&#xff0c;在vue及react中也遇到过1.富文本去除html标签去除html标签及 空格let r…

在基于简单Vertx Rest的应用程序上为REST资源设置基本响应HTTP标头

我是Vert.x的新手&#xff0c;但是作为Java开发人员&#xff08;非常努力&#xff09;&#xff0c;与NodeJS或其他任何基于Reactor的框架/库相比&#xff0c;我觉得它更加有趣并且很有前途。 因此&#xff0c;我正在使用Vert.x实现一个非常简单的Restful API。 今天的问题是我…

OAuth2认证有一定的了解

转到分享界面后&#xff0c;进行OAuth2认证&#xff1a; 以新浪为例&#xff1a; 第一步、WebView加载界面&#xff0c;传递参数 使用WebView加载登陆网页&#xff0c;通过Get方法传递三个参数&#xff1a;应用的appkey、回调地址和展示方式display(如手机设备为mobile)&#x…

声速的测量的实验原理和应用_CEMS烟气在线分析仪测量原理计经典应用

烟气连续在线监测系统运用抽取冷凝采样、后散射烟尘浓度测量、皮托管烟气流速测量及计算机网络通讯技术&#xff0c;实现了固定污染源污染物排放浓度和排放总量的在线连续监测。同时又针对国内煤种较杂、煤质变化大、污染物排放浓度高、烟气湿度大的状况从技术上进行了改进。并…