声明对象 创建对象

关于此主题的文章很多(绝大多数),但我只是想贡献我的两分钱,并写一篇简短的文章,介绍如何使用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

声明对象 创建对象

声明对象 创建对象_流利的对象创建相关推荐

  1. 并发加对象锁_通用并发对象池

    并发加对象锁 在本文中,我们将介绍如何在Java中创建对象池. 近年来,JVM的性能成倍增加,大多数类型的对象几乎都变得多余,从而提高了对象池的性能. 从本质上讲,对象的创建不再像以前那样昂贵. 但是 ...

  2. java 对象压缩_理解Java对象:要从内存布局及底层机制说起,话说....

    前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上一篇文章中我们说了Java的类和对象在JVM中的存储方式,并使用HSDB进行佐证,没有看过上一篇文章的小伙伴可以点这里:< 这篇文章主要 ...

  3. 简述垃圾对象产生_使用零垃圾创建数百万个对象

    简述垃圾对象产生 如性能优化第一规则中所述,垃圾是快速代码的敌人. 通过使用垃圾收集器的服务,它不仅会破坏任何确定性的性能,而且我们开始用垃圾填充CPU高速缓存,这将导致程序的高速缓存未命中. 那么, ...

  4. java怎么打印对象内容_如何打印对象内容

    1. 一个最基本的例子 使用Logging框架写Log基本上就三个步骤 引入loggerg类和logger工厂类 声明logger 记录日志 下面看一个例子 //1. 引入slf4j接口的Logger ...

  5. 对象空指针_可选和对象:空指针救星!

    对象空指针 没有人喜欢空指针异常 ! 我们有办法摆脱它们吗? 也许 . . . 这篇文章中讨论了几种技术: 可选类型(Java 8中的新增功能) 对象类(旧的Java 7东西!) Java 8中的可选 ...

  6. 2019写给对象的话_写给对象的一段话暖心

    希望对您有帮助,谢谢 写给对象的一段话暖心 导读: 本文是关于写给对象的一段话暖心,如果觉得很不错, 欢迎点评和分享! 1 .有你,就是好!心事变很少:不烦也不恼.有你,就是好! 甜蜜心中绕: 幸福早 ...

  7. java新建对象校验_验证某个对象是否是一个mock对象或者一个spy对象

    C**f回复了y**4在课程中的问题:final和自动装配... v**g添加了笔记:James Gosl... c**k向课程作业中提交了代码 我**-向课程作业中提交了代码 2**9在课程中提出了 ...

  8. ossfs挂载百度对象存储_阿里云对象存储OSS挂载工具

    前言 宝塔面板里有类似服务9.9一个月,愿意花钱的大佬们也不会搜到我这篇文章 不想花钱的小伙伴们就仔细看看下面我这篇文章吧 科普:linux常用命令: ls 查看当前目录下文件 安装及配置 下载:安装 ...

  9. 2019写给对象的话_[想对对象说的一句情话]2019年最想对你说的十句情话

    1.请对我耐心一点,就像我对你一样. 2.你相信我,我就会感到很幸福了. 3.请不要忘记,我也有心,尽量不要让我太伤心,心碎了捡起来好麻烦. 4.我偶尔不听你的话是有原因的,因为你从来都没听过我的话, ...

最新文章

  1. 20个精美图表,教你玩转 Pyecharts 可视化
  2. python语言编程环境-python3编程环境搭建
  3. 【Android 应用开发】 ActionBar 样式详解 -- 样式 主题 简介 Actionbar 的 icon logo 标题 菜单样式修改
  4. NSIS修改开始菜单中图标
  5. crawler_JVM_DNS_在爬虫中的应用
  6. 从Java角度看Golang
  7. Oracle 中 for update 和 for update nowait 的区别
  8. wordcount java分析_JavaWordCount
  9. 递归(特别重要,小计算用)
  10. linux为mysql用户授权,Linux环境 Mysql新建用户和数据库并授权
  11. matlab在电磁学中的应用,MATLAB在电磁学中的应用
  12. tcp 协议中发送窗口的大小应该是_面试必备--TCP协议中的窗口机制滑动窗口详解...
  13. Windows连接Linux的常用工具
  14. 【React教学】通用型DataTable组件——400行内
  15. 修改ASP.NET MVC Ajax分页组件ASP.NET MvcPager一个小Bug并修该样式为自己所用(三)...
  16. 6.2神经网络算法应用上学习笔记
  17. 论文中MathType公式居中,编号右对齐
  18. 考研英语 - 句子的结构 - 语法
  19. 基于PYTHON的艺术签名设置
  20. Scratch编程与游戏:大鱼吃小鱼!

热门文章

  1. 面试-线程池的成长之路
  2. 键值存储之外,Redis还有这些用法
  3. Properties文件的XML格式
  4. mysql查询优化explain命令详解
  5. 1分钟了解协同过滤,pm都懂了
  6. 06-Mapper动态代理
  7. 没有回家的等于没过年
  8. 利用redis保存验证码并设置过期时间
  9. opencv立方体的画法_用opengl立方体的画法
  10. java分布式对象(RMI+部署使用RMI的程序)