我应该从返回null的函数返回null或将“null object”模式应用于函数吗?

时间:2008-10-01 17:34:55

标签: java

假设您有一个返回日期的函数:

Date myFunc(paramA, paramB){
   //conditionally return a date?
}

从此函数返回null是否合适?这似乎很难看,因为它迫使客户检查null

“空对象”模式是解决此问题的实现模式 我不是null对象模式的忠实粉丝,但是,即使是空的,也总是返回一个列表是有意义的,而不是返回null
但是,在Java中,一个空日期将被清除并具有1970年。

这里最好的实施模式是什么?

8 个答案:

答案 0 :(得分:7)

空对象模式不适用于您要执行的操作。该模式是关于创建一个在其实现中没有功能的对象,您可以将其传递给需要对象不为null的给定函数。 Eclipse中的一个示例是NullProgressMonitor,它是IProgressMonitor的空实现。

如果你返回一个像“1970”这样的“空”日期,你的客户仍然需要通过查看它是否为1970来检查它是否为“空”。如果它们没有,则会发生错误行为。但是,如果返回null,它们的代码将快速失败,并且它们将知道它们应该检查null。此外,1970 可能是一个有效的日期。

你应该记录你的方法可能返回null,就是这样。

答案 1 :(得分:5)

null是完全可以接受的。但是,如果要在错误上返回null,请考虑抛出异常。

答案 2 :(得分:2)

如果有可能找不到日期,那么null就有意义了。否则你最终会返回一些神奇的日期(比如1970年代),这会让人们更加难以接触到函数,而不仅仅是返回null。

文件说它可以返回null,但是......

答案 3 :(得分:1)

我不是空对象模式的粉丝。

如果null是有效且预期的返回值,则返回它。如果它是由错误条件引起的,则异常会更有意义。

有时候,真正的问题是该方法应该返回一个更复杂的类型来代表更多的信息。在这些情况下,很容易陷入陷阱并返回一些基本类型,加上一些特殊的魔术值来表示其他状态。

答案 4 :(得分:1)

此方法的预期结果似乎是日期,或者没有找到。找不到案例通常由返回null表示。虽然有些人会使用异​​常来表示这种情况,但我不会(因为它是预期的结果而且我从未成为异常处理的粉丝)。

如上所述,Null对象模式不适用于这种情况。事实上,根据我自己的经验,它不适合许多情况。当然,我有一些偏见,因为它被严重误用了一些经验; - )

答案 5 :(得分:0)

如果它没有出现性能影响,我喜欢使用显式查询方法,然后使用例外:

if(employee.hasCustomPayday()) {
    //throws a runtime exception if no payday
    Date d = emp.customPayday();
}

答案 6 :(得分:0)

如果这不是通常应该发生的情况,请使用例外。

否则,(如果这是例如事件的结束日期),只返回null。

在任何情况下都请避免使用魔法值;)

答案 7 :(得分:-1)

您可以尝试使用输出参数

boolean MyFunction( a,b,Date c)
{
  if (good) 
     c.SetDate(....);
  return good;

}

然后你可以称之为

Date theDate = new Date();
if(MyFunction(a, b ,theDate ) 
{
   do stuff with C
}

它仍然需要您检查一些内容,但是在这种情况下无法避免某些检查。

虽然不推荐使用SetDate,但日历实现只是丑陋。

愚蠢的API改变太阳曾经做过。