假设您有一个返回日期的函数:
Date myFunc(paramA, paramB){
//conditionally return a date?
}
从此函数返回null
是否合适?这似乎很难看,因为它迫使客户检查null
。
“空对象”模式是解决此问题的实现模式
我不是null对象模式的忠实粉丝,但是,即使是空的,也总是返回一个列表是有意义的,而不是返回null
。
但是,在Java中,一个空日期将被清除并具有1970年。
这里最好的实施模式是什么?
答案 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改变太阳曾经做过。