【问题标题】:Service layer: What to return if query argument is null?服务层:如果查询参数为空,返回什么?
【发布时间】:2013-03-05 01:18:57
【问题描述】:

假设我们有一个服务方法getById(Long id),它根据其ID返回一个实体。如果 id 为空,正确的操作是什么?

抛出 IllegalArgumentException?

抛出 NullPointerException? (番石榴 Preconditions.checkNotNull 这样做)

返回空?

既然永远不会有 id == null 的实体,那么返回 null 似乎不是那么糟糕?我的意思是如果 id 不存在,该方法无论如何都会返回 null。

先决条件是很好的单行代码,但在这种情况下抛出 NullPointerException 似乎很极端。

这里的“最佳实践”是什么?

【问题讨论】:

  • 为什么方法签名不能是getById(long id),而是将NPE推送到服务消费者的代码?

标签: java nullpointerexception illegalargumentexception method-parameters


【解决方案1】:

始终最好使用NullPointerException,因为在实体集合中没有找到 ID 中的值。

【讨论】:

    【解决方案2】:

    idnull 没有记录,因此如果给定没有记录的“有效”id,则该方法应该执行任何操作。这就是最小意外原则。消费者将针对未找到的情况进行编码,因此应将其覆盖。

    有一件事,一个尚未持久化的新记录的id 是什么?如果碰巧是null

    ,这可能会导致你的行为偏离

    【讨论】:

    • 是的,新记录的 id 为空。但是只要不持久化,反正不存在也不应该返回?
    • 但是如果一条新记录在没有被持久化的情况下被交给了一些其他代码,然后该代码试图用它的 id 做一些事情,你会通过抛出 IllegalArgumentExecption("only persisted records can be found by id") 更快地失败,所以在这种情况下你可能会偏离...在任何情况下,返回 null 通常是一种难闻的气味,抛出 NotFound 或返回 Optional 通常更好
    • 如果新记录有idnullnull 表示新记录,并且您的getById 方法不能用于尚未持久化的记录,因此在这种情况下抛出一个异常,因为有 are 记录具有 null ID,但服务层不可能找到它们。 OTOH,如果创建新记录每次都生成 ID,则没有(持久或不持久)具有 null ID 的记录,因此唯一的含义是“未找到”。在您有多种含义的情况下,“未找到”是最不重要的
    【解决方案3】:

    将 null 传递给此类方法表示存在错误。没有人会想要找到具有空 ID 的实体,因为不可能存在这样的东西。所以这可能意味着 UI 层存在绑定问题,或者调用者忘记在其表单中添加隐藏的 ID 字段,或其他原因。

    返回 null 会隐藏错误,或者使其更加模糊。抛出异常会及早发现错误,并带有清晰的错误消息,从而可以及早修复它,并使应用程序更加健壮。

    对于 null 的不可为 null 参数的约定是抛出 NullPointerException。这就是我会做的。

    【讨论】:

    • 我选择了这个答案。最有意义的是,传入 null 可能暗示其他地方存在问题。
    猜你喜欢
    • 1970-01-01
    • 2021-09-02
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多