声明对象 创建对象_流利的对象创建

声明对象 创建对象

关于此主题的文章很多(绝大多数),但我只是想贡献我的两分钱,并写一篇简短的文章,介绍如何使用Java中的Fluent Object Creation模式或对象构建器实例化Value Objects。
值对象是由其状态(值)而不是其在内存中的地址定义的抽象。 价值对象的示例是诸如金钱,数字,坐标等之类的东西。它们不是用来描述业务对象,而是用于描述具体不可分割的实体。 此外,它们是将其添加到收藏和地图的绝佳选择。

在Java中,应该将Value Objects声明为final,并且不提供setter方法,基本上使它在创建后保持不变,这是非常重要的

需求。 最终声明它们会使它们无法充当父对象。 这是通过设计完成的,因为价值对象应该对小的具体实体进行建模。 原因是我们应该能够创建和比较这些对象的多个副本,这始终是通过状态而不是通过引用来完成的。 另外,您应该声明适当的equals()hashCode()方法以符合适当的值对象的条件。 在C ++中,适用相同的原理。 在C ++中,您应该使用Copy构造函数并重载赋值和比较运算符。 流利的对象创建模式使价值对象实例化优雅而干净。 很快我们就会看到,使用流畅的对象创建可以带来很多好处。

从API用户的角度来看,应用此模式的最终结果将如下所示:

Money fiveEuros = new Money.Builder().currency(Currency.EURO).value(5.0L).countryOfOrigin("Spain").type("Coin").reverse("Map of Europe").obverse("Map of Spain").addColor("Bronze").addColor("Silver").year("1880")
.build();

我认为您会同意,这种模式与之相反,流程更加顺畅:

Money fiveEuros = new Money();
fiveEuros.setCurrency(Currency.EURO);
fiveEuros.setValue(5.0L);
fiveEuros.countryOfOrigin("Spain");
fiveEuros.type("Coin");
fiveEuros.reverse("Map of Europe");
fiveEuros.obverse("Map of Spain");List<String> colors = new ArrayList<String>();
for(String color: new String[] {"Bronze", "Silver"}) {colors.add(color);
}fiveEuros.setColors(colors);
fiveEuros.setYear("1880");

似乎坏了,并且有很多打字和重复。 在我看来,这是一个构建相当大的价值对象的示例,其中大多数往往很小。 在讨论以这种方式创建对象的好处之前,让我们看一下这种模式的结构:

public final class Money {private Long value;private String countryOfOrigin;     private Currency currency;private String type; private String reverse;private String obverse;    private List<String> colors;private Date year;    private Money() {   }// -- getters, hashCode, equals -- //// Static inner Builder classpublic static class Builder {private Money _temp = new Money();
public Builder value(Long val) {
_temp.value = val;
return this;
}
public Builder countryOfOrigin(String countryOfOrigin) {
_temp.contryOfOrigin = countryOfOrigin;return this;
}
public Builder currency(Currency c) {
_temp.currency = c;
return this;
}
public Builder type(String t) {
_temp.type = t;
return this;
}
public Builder reverse(String r) {
_temp.reverse = r;
return this;
}public Builder obverse(String o) {
_temp.obverse = o;
return this;
}public Builder addColor(String c) {
if(_temp.colors == null) {_temp.colors = new ArrayList<String>(); }_temp.colors.add(c);
return this;
}public Builder year(String y) {if(y == null || y.isEmpty()) {_temp.year = new Date();}else {_temp.year = DateFormat.parse(y);}
return this;
}
public Money build() {// Validate objectif(Strings.isNullOrEmpty(_temp.name) || _temp.currency == null) {throw new IllegalArgumentException("Coin currency and value required");}
return _temp;
}}
}

这也是一个问题,但是我更喜欢静态内部类方法。 我喜欢将构建者称为“规范性”
Money.Builder。 还需要将其设为静态 ,因为构建器实例需要独立于封闭类生活。 我喜欢这种模式,因为它具有以下优点:

  1. 更大的对象封装:通过将Money构造函数设为私有(这只是样式),我可以轻松地使用构建器强制执行对象构造。 这完全掩盖了创建该对象的所有复杂性:列表创建,日期解析等。从用户的角度来看,最终得到的是一个易于实例化的对象。 我的插图很简单,但是可以想象更复杂的对象图。
  2. 代码可读性:使用此模式创建对象,使单元测试和代码非常易于阅读和遵循。
  3. 从长远来看,键入次数更少:即使您必须为每个添加的属性添加一个额外的构建器方法,从长远来看,保存下来的键入数量还是值得的。

结论

使用流畅的创建模式需要更多的工作,但是最终获得回报的好处。 它使实例化对象非常优雅和干净。 您不必将其与Value Objects一起使用,使用Fluent Object Creation的大部分好处是当您需要构建相当复杂的对象图时,但是我想证明它也可以适用 小价值的对象。

参考:我们的JCG合作伙伴 Luis Atencio在Reflective Thought博客上的Fluent Object Creation 。

翻译自: https://www.javacodegeeks.com/2013/01/fluent-object-creation.html

声明对象 创建对象

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

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

相关文章

shell脚本之shellcode自动提取工具

最近一直在忙着写论文。突然领导又分配任务&#xff0c;帮写个自动提取shellcode的脚本工具。因为之前&#xff0c;我们都是用objdump查看后&#xff0c;把shellcode一个个添加进去&#xff0c;很麻烦&#xff0c;害怕写错。所以说我们写这个工具还是挺有必要的。首先我们要先了…

Apache Kafka流+机器学习(Spark,TensorFlow,H2O.ai)

我于2017年5月开始在Confluent工作&#xff0c;担任技术传播者&#xff0c;专注于围绕开源框架Apache Kafka的主题。 我认为机器学习是当今最热门的流行语之一&#xff0c;因为它可以在任何行业中增加巨大的商业价值。 因此&#xff0c;您还会从我这里收到有关Apache Kafka&…

dmp文件导入11oracle数据库,如何将dmp文件导入到自己的oracle数据库中

1、首先&#xff0c;我们可以先建立自己的一个用户表空间&#xff0c;创建表空间的格式如下&#xff1a;create tablespace test(表空间的名字)datafile D:\oracle\product\10.2.0\userdata\test.dbf (这边可以写成oracle的某个路径下)size 50m (初始大小)autoextend on;(自动…

NOIP模拟测试7「方程的解·visit」

visit 由于一些不可预知的错误导致我一直WA 错误最后说 思路 方案一 假设终点在出发点右上方&#xff08;这样假设只是为了方便&#xff09; 假设向左走了a步&#xff0c;向右下了b布&#xff0c;那么相应的我们要向右走ma&#xff0c;向上nb步 总步数t 所以由多重集方案数可得…

jsf绑定bean_JSF –渴望的CDI bean

jsf绑定bean每个人都知道JSF 2中热切的托管bean。 ManagedBean具有eager属性。 如果eager true并且范围是application&#xff0c;那么必须在应用程序启动时而不是在第一次引用该bean时创建此bean。 当您想在应用程序启动期间加载应用程序范围的数据&#xff08;例如&#xff0…

红旗系统linux忘了开机密码,红旗Linux6.0中忘记了root密码

很久很久以前&#xff0c;用虚拟机安装了red flag6.0windows xp 的双系统&#xff0c;很久很久以后&#xff0c;打开虚拟机red flag系统忘记了密码&#xff1a;在网上搜了下解决办法&#xff0c;转了先&#xff0c;不知管不管用&#xff01;

在网页中的flash游戏,按方向键浏览器的滚动条会跟着滚动

今天总算把这个困扰我N久的问题给解决了&#xff0c;在我的flash游戏《牧场物语》中有方向键操作&#xff0c;但是在按上下方向键的时候浏览器右边的滚动条跟着滚动&#xff0c;也一上一下的&#xff0c;弄的我头晕&#xff0c;还让不让人活啊&#xff0c;今天终于得到答案了。…

谁最终需要Java模块?

拼图问题为1000。我作为X想要JPMS模块。 如果不是平台开发人员&#xff0c;X是什么&#xff1f; 我的回答是X是人&#xff08;减去平台开发人员&#xff0c;因为那是一个条件&#xff09; 。 我们都需要模块系统具有更安全的代码&#xff0c;从而产生更可靠的系统&#xff0c;…

linux 删除带a的文件格式,linux基础命令练习题

2、如何通过命令行重启linux操作系统&#xff1f;shutdown -r now |reboot |init 63、如何在命令行中快速删除光标前的内容&#xff1f;ctrl uctrl k (删除光标之后的内容)5、设置/test/a.txt属主有读写执行权限&#xff0c;属组&#xff0c;有读写&#xff0c;其他账户无权限…

linux安全软件 腾讯,腾讯安全团队发现一存在24年的Linux 0day高危漏洞

腾讯安全团队近日向Linux社区提交了两个Linux X.25套接字漏洞&#xff0c;该漏洞可能造成权限提升&#xff0c;攻击者利用漏洞可能控制整个系统。漏洞风险等级为高&#xff0c;漏洞影响内核版本为2.1.16&#xff5e;5.9.8的Linux系统。目前这些漏洞尚未修复&#xff0c;漏洞细节…

在Salesforce中调用外部系统所提供的的Web Service

这里需要提供外部service所对应的WSDL文件&#xff08;Salesforce只支持从本地上传&#xff09;&#xff0c;并且提供的WSDL文件有如下两点要求&#xff1a; 1&#xff09;&#xff1a;wsdl 文件只能有一个binding&#xff0c;Salesforce是不支持多个binding的 2&#xff09;&a…

linux查询日志中页面返回状态码,[linux shell] Shell脚本实现apache日志中的状态码分析...

这篇文章主要介绍了Shell脚本实现apache日志中的状态码分析,本文先是介绍了按天切割日志的方法,然后给出了分析访问状态码的脚本,需要的朋友可以参考下一、首先将apache日志按天切割复制代码 代码如下:vi /etc/httpd/conf/httpd.confErrorLog "|rotatelogs /var/log/httpd…

e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (四) Q 反回调...

上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step &#xff08;三&#xff09; SqlServer数据库的访问” 下面讲一下&#xff0c;对于在写Node.js自动化测试脚本过程中&#xff0c;的编写回调问题&#xff0…

基于比率的路由到旧版和现代应用程序–通过Spring Cloud的Netflix Zuul

从应用程序的旧版本迁移到应用程序的现代化版本时&#xff0c;一个非常普遍的要求是能够将用户缓慢迁移到新应用程序。 在本文中&#xff0c;我将介绍通过Spring Cloud使用对Netflix Zuul的支持编写的这种路由层。 在继续之前&#xff0c;我必须承认&#xff0c;此处演示的大多…

linux查找设备所在分片,Linux设备驱动统一模型解析

soc节点指定了&#xff1c;0x0 0xe0000000 0x00100000&#xff1e;&#xff1b;此属性值指定对于1024KB范围的地址空间&#xff0c;在物理0x0处寻址的子节点映射到物理0xe0000000的父地址。通过这种映射&#xff0c;串行设备节点可以通过0xe0004600地址的加载或存储、0x4600(在…

一个兼容所有浏览器的阻止事件冒泡方法

function stopBubble(event) { //阻止冒泡事件 //取消事件冒泡 var e arguments.callee.caller.arguments[0] || event; //若省略此句&#xff0c;下面的e改为event&#xff0c;IE运行可以&#xff0c;但是其他浏览器就不兼容 if (e && e.stopPropagation) { // this …

linux shell 脚本 supress,《linux Shell 脚本攻略》进阶学习(第一部分)

第二章命令之乐cat 不仅可以读取文件并且连接数据&#xff0c;它还能从标准输入中进行读取要从标准输入中读取&#xff0c;就要使用管道操作符echo Text through stdin | cat - file.txt。这里的-被作为来之stdin 文本的文件名称实例 在file.txt 中写入dfagfmirgjriogjrogijdfg…

xaml_XAML或JavaFx?

xaml这是使用XAML和JavaFx构建应用程序的快速&#xff0c;主观&#xff0c; 无权且非常不科学的比较。 比较是基于我与每个人合作的个人经验。 在XAML方面&#xff0c;这意味着WPF和Win8存储应用程序 。 在JavaFx方面&#xff0c;这意味着Windows 7应用程序。 JavaFX JavaFx被…

古代猪文

题意&#xff1a; 给定q &#xff0c;n 求$q^{\sum\limits {d|n} C_{n}^{d} }mod 999911659$ 题解&#xff1a; 首先如果你直接算次方上的数的话会炸掉&#xff0c;因为欧拉定理我们可以得到 $q^{\sum\limits {d|n} C_{n}^{d} mod999911658}mod 999911659$ 因为mod的数是个合数…

linux gcc 7.3.0安装,升级gcc到7.3.0

#查看当前版本gcc --version # 先查看当前版本确认是否需要升级tar -zxvf gcc-7.3.0.tar.gzcd gcc-7.3.0#检测和安装相关依赖包&#xff0c;这个过程需要耐心等待&#xff0c;此步骤会将依赖包下载到gcc-7.3.0目录&#xff0c;如果因网络原因无法完成请自行使用wget下载。该步骤…