函数应该返回 null 还是空对象?

Posted

技术标签:

【中文标题】函数应该返回 null 还是空对象?【英文标题】:Should functions return null or an empty object? 【发布时间】:2010-12-10 05:47:33 【问题描述】:

从函数返回数据时,最佳实践是什么。返回 Null 还是空对象更好?为什么要一个人做一个而不是另一个?

考虑一下:

public UserEntity GetUserById(Guid userId)

     //Imagine some code here to access database.....

     //Check if data was returned and return a null if none found
     if (!DataExists)
        return null; 
        //Should I be doing this here instead? 
        //return new UserEntity();  
     else
        return existingUserEntity;

让我们假设在这个程序中存在有效的情况,即数据库中没有具有该 GUID 的用户信息。我会想象在这种情况下抛出异常是不合适的?另外我的印象是异常处理会损害性能。

【问题讨论】:

我想你的意思是if (!DataExists) 这是一个架构问题,非常合适。 OP 的问题是有效的,无论它试图解决什么业务问题。 这个问题已经得到了充分的回答。我认为这是一个非常有趣的问题。 'getUser()' 应该返回 null。 'getCurrentUserInfo()' 或 'getCurrentPermissions()',OTOH,将是更具启发性的问题——无论谁/或是否有人登录,它们都应该返回一个 非空答案对象。跨度> 否 @Bergi 另一个是重复的。我的第一个被问到,在 10 月,另一个被问到 3 个月后的 12 月。另外,另一个人谈到了一个略有不同的系列。 【参考方案1】:

如果在异常情况下您使用无效的用户 ID 调用该代码,则应该引发异常。如果这不是特殊情况,那么您实际上所做的是使用“getter”方法来测试用户是否存在。这就像尝试打开一个文件以查看它是否存在(让我们在这里坚持使用 c#/java)而不是使用 exists 方法,或者尝试访问字典元素并通过查看返回值而不是查看它们是否存在首先使用“包含”方法。

因此,您很可能在使用诸如“存在”之类的附加方法来首先检查是否存在这样的用户。除非您遇到真正的性能问题,否则异常的性能绝对不是根本不使用它们的理由。

【讨论】:

我确信在这种特殊情况下最好返回 Null。请查看接受的答案并阅读 cmets。 对于预期的情况也不应该抛出异常。就像在我的示例中一样,有时可能找不到您要查找的用户 ID。因为如果您对预期的情况使用异常,并且这些情况在短时间内发生多次,那么异常处理的开销实际上会降低您的性能。就像在一个长时间运行的循环中说的那样。

以上是关于函数应该返回 null 还是空对象?的主要内容,如果未能解决你的问题,请参考以下文章

在 WebAPI 中返回空 json

假如数组接收到一个null,那么应该怎么循环输出。百度结果,都需要提前判断。否则出现空指针异常。。我还是想在数组中实现保存和输出null。

php实现空对象模式

怎么判断数组是null还是空??数组空是指数组中没有元素??数组null是数组中元素都是0??

以Java 8方式检查对象中包含的空对象和空值

具有空对象模式的 DAO