0

我很好奇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:是否ofNullable明显创建了一个冗余对象?
  • 问题 2:避免使用样板代码是否值得?
  • 问题3:这个问题是在谈论过早优化吗?
4

2 回答 2

3
  1. 是的
  2. 这是一个见仁见智的问题。我个人发现使用 if 块的代码更具可读性,而不是更冗长
  3. 是的。创建一个短暂的 Optional 对象的成本可以忽略不计,尤其是与执行 JPA 查询相比。因此,如果发现基于可选的代码更具可读性和优雅性,则不必担心性能。
于 2015-10-20T22:05:33.113 回答
1

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

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

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

  • 将字段的类型从 更改IntegerOptional<Integer>,这样读者就会清楚该字段是可选的,他必须在使用前检查它。

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

可能还有其他方法。

于 2015-10-20T22:23:01.600 回答