李卫公在他的 blog 中讨论了一个 有关函数返回值的问题。其在文章中的初始问题,大致可以描述为: 需要编写一个函数,从 HMLT 源代码中提取某个节点的文本,在提取失败的情况下,应当返回一个空字符串还是 null 值。 李卫公在文中说明了,如果在失败的情况下返回一个空字符串的话,对于该函数的调用者而言,是无法区分出该函数是从目标节点中提取到一个空字符串,还是实际上什么也没有提取到。 通常来说,一个函数所要返回的值,要么是一个数据(例如一个员工),要么是一组数据(例如所有女性员工)。 1. 对于第一种情况而言,函数的返回值类型应当是值(value)类型或者实体(entity)类型。例如,需要根据员工编号得到一个员工对象,我们可以编写一个这样的函数:

mysql返回decimal为null mysql函数返回值类型_null

public

 Employee getEmployee( int  id); 如果能找到具有该编号的员工,该函数返回一个 Employee 对象。否则返回 null 值,表示未找到指定 id 对应的员工;或者抛出一个 checked exception,函数的识别标志因此需要修改为:

mysql返回decimal为null mysql函数返回值类型_null

public Employee getEmployee(

int  id)  throws  EmployeeNotFoundException; 由函数的调用者来捕获该异常,并根据需要进行处理。

2. 对于第二种情况而言,函数的返回值类型应当是 Collection 类型(包括 Map 类型)。例如,需要根据查询某月某部门迟到员工的列表,我们可以编写一个这样的函数:

mysql返回decimal为null mysql函数返回值类型_null

public  Set <

Employee >  getLateEmployees(Month month, Department department); 如果查询结果是,在八月份技术部没有一位同学迟到,太好了,这个函数只需要简单地返回一个空 Set 对象即可。

对于第一种情况,假设我们选择的是让函数返回 null 值,如果在程序中有相当多的地方需要调用该函数,那么我们有可能会在代码中发现很多像

mysql返回decimal为null mysql函数返回值类型_mysql返回decimal为null_04

mysql返回decimal为null mysql函数返回值类型_null_05

if  (employee  ==  

null )  ... {

mysql返回decimal为null mysql函数返回值类型_blog_06

    ...

mysql返回decimal为null mysql函数返回值类型_mysql返回decimal为null_07

} 这样的代码,这些代码通常并不是用来处理业务逻辑,编写它们的最主要目的可能仅仅只是为了防止出现 NullPointerException。倘若这种情况降低了程序的可读性或者可维护性,我们可以采用 Null Object 模式来消除这些遍处滋生的防御代码。