使用 Optional#ofNullable 可能创建冗余对象?

Possible redundant object creation with Optional#ofNullable?

我很好奇 Optional 的用法。

使用以下代码片段,

public List<Some> read(
    @QueryParam("first_result") @Min(0)
    final Integer firstResult,
    @QueryParam("max_results") @Min(0)
    final Integer maxResults) {

    // ...

    if (firstResult != null) {
        query.setFirstResult(firstResult);
    }

    // ...
}

当我这样更改代码时,

ofNullable(firstResult).ifPresent(v -> query.setFirstResult(v));
  1. 见仁见智。我个人发现使用 if 块的代码更具可读性,而且并不真的更冗长
  2. 是的。创建一个短暂的 Optional 对象的成本可以忽略不计,尤其是与执行 JPA 查询相比。因此,如果发现基于可选的代码更具可读性和优雅性,则您不必担心性能。

另一种选择是首先防止 firstResult 变成 null,这样您就不必检查它并且可以避免容易犯的错误。

怎么做?这里有一些选项:

  • 如果 firstResult 是一个方法的结果,以某种方式对该方法进行编码 保证永远不会 return null (并添加单元测试以检查 它)。

  • 将字段的类型从Integer更改为Optional<Integer>,这样reader就清楚这个字段是可选的,他必须检查在使用它之前。

  • 更改写入 firstResult 的方法的 return 类型,使其 return 为 Optional<Integer>,并使用 return Optional.ofNullable(result)。这样,接收结果的代码必须在将 return 值存储到字段之前检查它,以防止它变成 null.

可能还有其他方法。