2015-10-20 59 views
0

我很好奇Optional的用法。可選的#ofNullable創建可能的冗餘對象?

有了下面的代碼片段,

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:這個問題是否在談論過早優化?
+0

這是如何比簡單的'if'語句更好? – ZhongYu

+0

也是創建lambda表達式對象的代價,並調用它的方法;以及這種複雜情況如何影響JIT優化器。 – ZhongYu

回答

3
  1. 這是見仁見智的問題。我個人發現,使用if代碼塊的代碼更具可讀性,而且實際上並不更詳細。
  2. 是的。創建短暫可選對象的成本可以忽略不計,特別是與執行JPA查詢相比。因此,如果找到更可讀和優雅的基於可選代碼,你不應該擔心性能。
1

另一種選擇是,以防止firstResult成爲null擺在首位,這樣你就不必檢查它,你能避免容易出錯。

怎麼辦?這裏有一些選擇:

  • 如果firstResult是一個方法,代碼的結果是法這是保證永不返回null(添加單元測試,以檢查它 )的方式 。

  • 將字段的類型從Integer更改爲Optional<Integer>,這樣,讀者就會清楚該字段是可選的,並且在使用該字段之前必須先檢查該字段。

  • 更改寫入firstResult的方法的返回類型,以便它返回Optional<Integer>,並使用return Optional.ofNullable(result)完成該方法。這樣,接收結果的代碼必須在將其存儲在字段中之前檢查返回值,以防止它變成null

可能還有其他方法。