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

时间:2015-10-20 22:00:23

标签: java optional premature-optimization

我对使用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:这个问题是否谈论过早优化?

2 个答案:

答案 0 :(得分:3)

  1. 这是一个意见问题。
  2. 我个人觉得使用if块的代码更具可读性,而不是更详细
  3. 是。创建短期可选对象的成本可以忽略不计,尤其是与执行JPA查询相比。因此,如果发现基于可选代码的代码更具可读性和优雅性,那么你不应该担心性能。

答案 1 :(得分:1)

另一个选择是阻止firstResult首先成为null,这样您就不必检查它,也可以避免容易出错。

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

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

  • 将字段类型从Integer更改为Optional<Integer>,这样读者就会明白此字段是可选字段,并且必须在使用之前对其进行检查。

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

可能还有其他方法。