Introduce Null Object(引入Null 对象)

一而再,再而三地检查对象是否null

public class Site {private Customer customer;public Customer getCustomer() {return customer;}
}public class Customer {private String name;private BillingPlan plan;private PaymentHistory history;public String getName() {return name;}public String getPlan() {return plan;}public String getHistory() {return history;}
}public class PaymentHistory {private Integer weeksDelingquent;public int getWeeksDelingquentInLastYear() {return weeksDelingquentInLastYear;}
}Customer customer = site.getCustomer();
BillingPlan plan;
if (customer == null) {plan = BillingPlan.basic();
} else {plan = customer.getPlan();
}
//...
String customerName;
if (customer == null) {customerName = "occupant";
} else {customerName = customer.getName();
}
//...
int weeksDelingquent;
if (customer == null) {weeksDelingquent = 0;
} else {weeksDelingquent = customer.getHistory().getWeeksDelingquentInLastYear();
}

重构:将null值替换为null对象

注意:空对象一定是常量,它们的任何成分都不会发生变化。因此可以使用Singleton 模式实现。

public interface Nullable {public boolean isNull();
}public class Site {private Customer customer;public Customer getCustomer() {return customer == null ? Customer.newNull() : customer;}
}public class Customer implements Nullable {private String name;private BillingPlan plan;private PaymentHistory history;public boolean isNull() {return false;}public static Customer newNull() {return new NullCustomer();}public String getName() {return name;}public String getPlan() {return plan;}public void setPlan(BillingPlan plan) {this.plan = plan;}public String getHistory() {return history;}
}public class PaymentHistory implements Nullable {private Integer weeksDelingquent;public boolean isNull() {return false;}public int getWeeksDelingquentInLastYear() {return weeksDelingquentInLastYear;}public static PaymentHistory newNull() {return new NullPaymentHistory();}
}public class NullCustomer extends Customer {public boolean isNull() {return true;}public String getName() {return "occupant";}public String getPlan() {return BillingPlan.basic();}public String getHistory() {return PaymentHistory.newNull();}}public class NullPaymentHistory extends PaymentHistory {public boolean isNull() {return true;}public int getWeeksDelingquentInLastYear() {return 0;}}Customer customer = site.getCustomer();
BillingPlan plan = customer.getPlan();
//...
String customerName = customer.getName();
//...
int weeksDelingquent = customer.getHistory().getWeeksDelingquentInLastYear();

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

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

相关文章

C++学习之路 | PTA乙级—— 1003 我要通过! (20分)(精简)

1003 我要通过! (20分) “答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。 得到“答案正确”的条件是:…

装修相片(第50天拍,全部,25号更新)

装修相片(第50天拍,全部,25号更新) 好不容易,找了个时间和相机,去把房子照了下来,因为准备要搬家了,怕搬家后乱乱的,没有了效果.1.厨房:厨柜700元/米,方太抽油烟机11902.客卧:3.主卧,富得宝,整套3480元.5.书房,书架(双虎),2300元.6.餐厅:7.沙发:3700元,这个一直觉得贵了.8.电视…

简明Python教程学习笔记_1_基本

参考:http://www.kuqin.com/abyteofpython_cn/index.html Learn Python in Y minutes:http://www.jianshu.com/p/1062bdd071cc python 部落:https://python.freelycode.com/ 简介 Python语言是少有的一种可以称得上即简单又功能强大的编程…

不止Alexa和AWS,揭秘亚马逊人工智能发展史

来源:腾讯科技编译:昱烨亚马逊上周四公布了2017年第四季度财报,盈利接近20亿美元,创下历史纪录。Alexa语音助手和AWS云计算服务是亚马逊业绩的亮点。《连线》杂志近日刊文,介绍了深度学习技术如何赋能Alexa和AWS&#…

C++学习之路 | PTA乙级—— 1004 成绩排名 (20分)(精简)

1004 成绩排名 (20分) 读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。 输入格式: 每个测试输入包含 1 个测试用例,格式为 第 1 行:正整数 n 第 2 行:第…

Separate Query from Modifier(分离查询和修改)

某个函数既返回对象状态值,又修改对象状态 重构:建立两个不同的函数,其中一个负责查询,另一个负责修改 动机 如果某个函数只是向你提供一个值,没有任何看得到的副作用,那么这是个很有价值的东西。 你可以任…

MapX的坐标问题

我们知道,一个GIS开发包或者GIS平台,和一般的图形系统的差别就在于其管理的对象都是有空间参考(或者叫地理参考)的,简而言之,空间参考就是坐标系,但坐标系不是简单的笛卡尔坐标系,因…

简明 Python 教程学习笔记_2_函数

1. Python 内建函数 Python 内建函数:https://docs.python.org/zh-cn/3.9/library/functions.html#classmethod Python 解释器内置了很多函数和类型,您可以在任何时候使用它们。以下按字母表顺序列出它们。 内置函数 abs() delattr() hash() memo…

LaTeX2e类和包的设计(一)

LaTeX2e类和包的设计(一)一、类和包版本介绍LaTeX2.09对用户书写class和package提供的支持很少,用户不得不使用底层命令。LaTeX2e提供了许多用于组织package文件的高级命令,同时在已有class和package的基础上建立另一个class或pac…

C++学习之路 | PTA乙级—— 1005 继续(3n+1)猜想 (25分)(精简)

1005 继续(3n1)猜想 (25分) 卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n3 进行验证的时候,我们需…

python实现地牢迷宫生成

python实现地牢迷宫生成基本属性生成房间生成墙壁生成门口生成通道基本属性 定义当前地牢的等级,地图长宽,房间数量,房间的最小最大长度,如下 class Map:def __init__(self):self.width 30self.heigh 30self.level 1self.roo…

Parameterize Method(令函数携带参数)

若干函数做了类似的工作,但在函数体中却包含了不同的值 重构:建立单一函数,以参数表达那些不同的值。

「谷歌大脑」提出通过对长序列进行摘要提取,AI可自动生成「维基百科」

原文来源:arXiv作者:Peter J. Liu、Mohammad Saleh、Etienne Pot、Ben Goodrich、Ryan Sepassi、Łukasz Kaiser、Noam Shazeer「雷克世界」编译:嗯~阿童木呀最近,经过研究证明,生成英文维基百科(English W…

redis基本用法学习(C#调用CSRedisCore操作redis)

除了NRedisStack包,csredis也是常用的redis操作模块(从EasyCaching提供的常用redis操作包来看,CSRedis、freeredis、StackExchange.Redis应该都属于常用redis操作模块),本文学习使用C#调用CSRedis包操作redis的基本方式…

简明Python教程学习笔记_3_模块

模块 如果你想要在其他程序中重用很多函数,那么你该如何编写程序呢?你可能已经猜到了,答案是使用模块。模块基本上就是一个包含了所有你定义的函数和变量的文件。为了在其他程序中重用模块,模块的文件名必须以.py为扩展名。 pyt…

年轻的程序员该如何规划自己的未来

下面是网友良少给我的回信,觉得其中一些内容具有警世作用,征得良少本人同意后,特公开其回信-------------------------------------------------------------------------------------------------------------------------- 孝祥:您好!非常感谢您的邀请…

C++学习之路 | PTA乙级—— 1006 换个格式输出整数 (15分)(精简)

1006 换个格式输出整数 (15分) 让我们用字母 B 来表示“百”、字母 S 表示“十”&#xff0c;用 12…n 来表示不为零的个位数字 n&#xff08;<10&#xff09;&#xff0c;换个格式来输出任一个不超过 3 位的正整数。例如 234 应该被输出为 BBSSS1234&#xff0c;因为它有 …

python: 使用socket实现局域网不同主机通信。解决ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。

目录1 socket的使用1.1 TCP方法1.2 UDP方法2 局域网内连接2.1总结1 socket的使用 1.1 TCP方法 在socket中使用socket.socket建立会话&#xff0c;如果是服务器&#xff0c;需要绑定服务器地址和端口号&#xff0c;然后进行循环监听&#xff0c;当有客户端连接时再接收数据。 …

Replace Parameter with Explicit Methods(以明确函数取代参数)

函数的行为&#xff0c;完全取决于参数值 public void setValue(final String name, final int value) {if ("height".equals(name)) {this.height value;return;}if ("width".equals(name)) {this.width value;return;}Assert.shouldNeverReachHere();…

德勤:2018年科技、传媒和电信行业未来趋势预测

来源&#xff1a;亿欧近日&#xff0c;德勤发布了《2018科技、传媒和电信行业预测》报告&#xff0c;对世界与中国的科技、传媒和电信行业在未来1-5年的趋势进行了预测。该报告通过与世界各国行业主管和评论家的数百场访谈及对世界各地数万名消费者进行的调查&#xff0c;分析了…