使用 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:
ofNullable
是否明显创建了一个冗余对象?
- 问题 2:避免样板代码是否值得?
- 问题三:这道题是在说过早优化吗?
- 是
- 见仁见智。我个人发现使用 if 块的代码更具可读性,而且并不真的更冗长
- 是的。创建一个短暂的 Optional 对象的成本可以忽略不计,尤其是与执行 JPA 查询相比。因此,如果您发现基于可选的代码更具可读性和优雅性,则您不必担心性能。
另一种选择是首先防止 firstResult
变成 null
,这样您就不必检查它并且可以避免容易犯的错误。
怎么做?这里有一些选项:
如果 firstResult
是一个方法的结果,以某种方式对该方法进行编码
保证永远不会 return null
(并添加单元测试以检查
它)。
将字段的类型从Integer
更改为Optional<Integer>
,这样reader就清楚这个字段是可选的,他必须检查在使用它之前。
更改写入 firstResult
的方法的 return 类型,使其 return 为 Optional<Integer>
,并使用 return Optional.ofNullable(result)
。这样,接收结果的代码必须在将 return 值存储到字段之前检查它,以防止它变成 null
.
可能还有其他方法。
我很好奇 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:避免样板代码是否值得?
- 问题三:这道题是在说过早优化吗?
- 是
- 见仁见智。我个人发现使用 if 块的代码更具可读性,而且并不真的更冗长
- 是的。创建一个短暂的 Optional 对象的成本可以忽略不计,尤其是与执行 JPA 查询相比。因此,如果您发现基于可选的代码更具可读性和优雅性,则您不必担心性能。
另一种选择是首先防止 firstResult
变成 null
,这样您就不必检查它并且可以避免容易犯的错误。
怎么做?这里有一些选项:
如果
firstResult
是一个方法的结果,以某种方式对该方法进行编码 保证永远不会 returnnull
(并添加单元测试以检查 它)。将字段的类型从
Integer
更改为Optional<Integer>
,这样reader就清楚这个字段是可选的,他必须检查在使用它之前。更改写入
firstResult
的方法的 return 类型,使其 return 为Optional<Integer>
,并使用return Optional.ofNullable(result)
。这样,接收结果的代码必须在将 return 值存储到字段之前检查它,以防止它变成null
.
可能还有其他方法。