***

3261 ワード

GuavaはGoogleが開発したオープンソースJAVAライブラリとして流行したのは、いくつかの理由があると思います. 
  • は開発者にJDK以外の便利な機能を提供することができ、開発者が自分の手書きが必要だったUtility機能
  • を便利に使用することができる.
  • 開発者は、JAVA自体の言語欠陥による
  • である可能性があるが、悪いプログラミング習慣を捨てることを強制することができる.
  • は、開発者に自分のプログラムモードとアーキテクチャを改善させる.この点はGuavaの例えばEventBus,Filter,Orderingなどの機能に反映される.

  • 今日から自分が学んだGuavaの知識を整理してまとめます.
    Optional 
    私はかつて1枚のドキュメントの総括プログラムの設計の10大生まれつきの欠陥を覚えていて、Nullの出現はその中の1つです.Google公式では、Nullは移動の混乱と未知のバグの最も主要なソースであり、nullは非常に曖昧な状況をもたらしやすいと考えています.例えば、Mapのgetメソッドがnullを返すと、Mapにこのkey値がないのか、key値があるのか、まったく分かりませんが、このkey値に対応するvalueは空です.これに対応するため、Google推奨プログラムではOptionalの最もNULLの代替品を使用しています. 
    次に、Optionalの簡単な使用例を見てみましょう.
    Optional<Integer> possible = Optional.of(5);
    possible
    .isPresent(); // returns true
    possible
    .get(); // returns 5

    Optionalの主旨はNullの代わりにNULL以外のObjectを使用し、isPresent法でこのObjectが持つ変化の対象が空かどうかを判断することである. 
    Optionalの構築方法
  • Optional.of(T)  非空の値をofに伝える方法を制定し、入力された値が空であれば、すぐに
  • をエラーします.
  • Optional.absent()は、空のオブジェクトを表すOptional
  • を返します.
  • Optiona.fromNullable(T)が入力したオブジェクトはNULLであっても非NULLであってもよく、isPresentにより代表オブジェクトが空であるか否かが判断される.

  • Optionalの一般的な方法
  • isPresent()は何度も言及していますが、ここでは
  • はあまり言いません.
  • T get()はエージェントオブジェクトを返し、戻り値が空であればIllegalStateExceptionのエラー
  • であることに注意する.
  • T or(T)はプロキシオブジェクトを返すが、プロキシオブジェクトが空の場合は
  • を返す代わりにパラメータの値を用いる.
  • T orNull()はプロキシオブジェクトを返しますが、プロキシオブジェクトが空の場合は
  • を返す代わりにNULLを使用します.
  • Set asSet()は、プロキシオブジェクトのみの可変の一例であるSet(Collections.singletonで作成)を返しますが、プロキシオブジェクトが空の場合は空のSet(Collections.emptySet()で作成された)
  • を返します.
    ここを見ると、Optionalもそんなに不思議ではないような気がします.簡単な包装で読むのが少し便利なようですが、実はこのような簡単な変更で、エージェントが空の場合、どのように処理すべきかを強制的に考えることができます.例を挙げると、T get().上位利用者が直接T.xxx()の方法でNullPointerExceptionを引き起こす可能性がある.しかし,我々が方法をOptional get()に再構成すると,上層利用者は自発的に判断する傾向にある.isPresent()の場合です.
    その他の選択肢
    もちろん、既存のインタフェースを変更すると大きな変更とリスクがあると思いますが、Guavaは便利な方法を提供しています.
  • Objects.firstNonNull(T,T)は、NULLでない最初のオブジェクト
  • を返します.
  • Strings.emptyToNull(String)空の文字列をNULL
  • に変更
  • Strings.NullToEmpty(String)NULLを空の文字列
  • に変更
  • Strings.isNullOrEmpty(String)この方法はよくありません.スペースしかない文字列を伝えるとfalse
  • を返すからです.