有关函数返回值类型的问题

李卫公在他的 blog 中讨论了一个 有关函数返回值的问题。其在文章中的初始问题,大致可以描述为:
需要编写一个函数,从 HMLT 源代码中提取某个节点的文本,在提取失败的情况下,应当返回一个空字符串还是 null 值。
李卫公在文中说明了,如果在失败的情况下返回一个空字符串的话,对于该函数的调用者而言,是无法区分出该函数是从目标节点中提取到一个空字符串,还是实际上什么也没有提取到。

通常来说,一个函数所要返回的值,要么是一个数据(例如一个员工),要么是一组数据(例如所有女性员工)。
1. 对于第一种情况而言,函数的返回值类型应当是值(value)类型或者实体(entity)类型。例如,需要根据员工编号得到一个员工对象,我们可以编写一个这样的函数:
public  Employee getEmployee( int  id);
如果能找到具有该编号的员工,该函数返回一个 Employee 对象。否则返回 null 值,表示未找到指定 id 对应的员工;或者抛出一个 checked exception,函数的识别标志因此需要修改为:
public Employee getEmployee( int  id)  throws  EmployeeNotFoundException;
由函数的调用者来捕获该异常,并根据需要进行处理。
2. 对于第二种情况而言,函数的返回值类型应当是 Collection 类型(包括 Map 类型)。例如,需要根据查询某月某部门迟到员工的列表,我们可以编写一个这样的函数:
public  Set < Employee >  getLateEmployees(Month month, Department department);
如果查询结果是,在八月份技术部没有一位同学迟到,太好了,这个函数只需要简单地返回一个空 Set 对象即可。

对于第一种情况,假设我们选择的是让函数返回 null 值,如果在程序中有相当多的地方需要调用该函数,那么我们有可能会在代码中发现很多像
if  (employee  ==   null {
    ...
}
这样的代码,这些代码通常并不是用来处理业务逻辑,编写它们的最主要目的可能仅仅只是为了防止出现 NullPointerException。倘若这种情况降低了程序的可读性或者可维护性,我们可以采用 Null Object 模式来消除这些遍处滋生的防御代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值