web-dev-qa-db-ja.com

グアバとApacheの同等のライブラリの大きな改善点は何ですか?

現在、Apacheコレクション、文字列ユーティリティなどを使用しています。ApacheFoundations実装から切り替える必要があるかどうかを判断する必要があります。

重要な基準は、開発者の使いやすさです。パフォーマンス/メモリ使用量は、私たちにとってまだ重要な問題ではありません。この時点では、開発の速度が重要な基準です。

グアバで開発者の生活が大幅に楽になったという意見をいただければ幸いです。

123
Pat

まず、javamonkey79で説明したように、Google GuavaとApache Commonsは同様の機能を共有していますが、どちらも対応する機能がありません。したがって、1つのライブラリのみに制限するのは賢明ではありません。

そうは言っても、選択する必要がある場合は、Guavaに必要な機能がない(まれな)場合にApache Commonsを使用したまま、Guavaを使用することを選択します。理由を説明してみましょう。

グアバはもっと「モダン」です

Apache Commonsは非常に成熟したライブラリですが、10年近くも経過しており、ターゲットJava 1.4。Guavaは 2007年にオープンソース化 、ターゲットJava 5、したがってGuavaはJava 5つの機能:genericsvarargsenums、およびautoboxing

グアバの開発者によると、ジェネリックは、Apache Commonsを改善する代わりに新しいライブラリを作成することを選択した1つの理由です(タイトルの下に google-collections FAQ を参照してください"これは、代わりにApache Commons Collectionsを改善しようとすることができたのでしょうか? ")。

私はそれらに同意します:多くの場合批判されますが(下位互換性のため制限なし)、JavaジェネリックはまだveryGuavaのように適切に使用すると便利です。非ジェネレーションコレクションを使用するよりも、やめたいと思います。

(Apache Commons 3.0、doestarget Java 1.5 +)

グアバは非常にうまく設計/文書化されています

コードには、APIをより読みやすく、発見しやすく、パフォーマンスが高く、安全で、スレッドセーフにするためのベストプラクティスと有用なパターンが満載されています...

Effective Java(素晴らしい本BTW)を読んで、コードの至る所にこれらのパターンがあります:

  • ファクトリメソッド(ImmutableList.copyOf()など)
  • ビルダーパターン(ImmutableList.builder()JoinerCharMatcherSplitterOrdering、...)
  • 不変性(不変コレクション、CharMatcherJoinerSplitter、...)
  • 実装の非表示(Predicates.xXx、...)
  • 継承よりも合成を優先する(ForwardXXXコレクション)
  • ヌルチェック
  • 列挙シングルトンパターン
  • シリアル化プロキシ
  • よく考えられた命名規則

これらの設計の選択肢によってもたらされる利点について、何時間も説明できます(ご希望があれば教えてください)。重要なのは、これらのパターンは「ショー用」であるだけでなく、真の価値があることです。APIは使いやすく、習得が容易です(文書化のしやすさを忘れましたか?)。多くのクラスは、不変であるため、より単純/スレッドセーフです。

ボーナスポイントとして、コードを見て多くのことを学びます:)

グアバは一貫しています

Kevin Bourrillion(Guavaの主任開発者)は、ライブラリ全体で高レベルの品質/一貫性を維持する素晴らしい仕事をしています。もちろん彼は一人ではなく、多くの 偉大な開発者 がGuavaに貢献しています( Joshua Bloch 、現在Googleで働いています!)。

Guavaの背後にある中核となる哲学と設計選択はライブラリ全体で一貫しており、開発者はJDK APIの過去の誤りから学んだ非常に優れた(IMO)API設計原則を順守しています(theirの誤りではありませんが) )。

グアバには高い出力重量比があります

Guavaの設計者は、APIを最も有用なものに限定して、多くの機能を追加する誘惑に抵抗します。彼らは、一度追加された機能を削除するのは非常に難しいことを知っており、 APIデザインに関するJoshua Blochのモットー:「疑わしいときは、除外する」 に従います。また、@ Betaアノテーションを使用すると、 特定のAPIにコミットせずにデザインの選択をテストする を使用できます。

上記の設計選択により、非常にコンパクトなAPIが可能になります。 MapMaker を見るだけで、「シンプルな」ビルダーに詰め込まれたパワーを確認できます。他の適切な(より簡単ですか?)例は CharMatcherSplitter 、および Ordering です。

グアバのさまざまな部分を構成することも非常に簡単です。たとえば、複雑な function ?の結果をキャッシュするとします。この関数をMapMakerとBINGOにフィードすると、スレッドセーフなコンピューティングマップ/キャッシュが得られます。マップ/関数の入力を特定の文字列に制限する必要がありますか?問題ありません。 ConstrainedMap で囲み、 CharMatcher を使用して不適切な文字列を拒否します...

グアバは活発に開発されています

Apache Commonsの開発はCommons Lang 3.0の作業で加速しているように見えますが、Guavaは現時点でより多くのSteamを採用しているようですが、Googleは内部クラスをより多くオープンソース化しています。

Googleは内部的にこれに大きく依存しているため、すぐに消えることはないと思います。さらに、その共通ライブラリをオープンソース化することで、Googleはより簡単にソースをオープンできるようになりますother依存するライブラリ( repackaging ではなく、Guice現在 does =)。

結論

上記のすべての理由から、新しいプロジェクトを開始するとき、グアバは私の頼りになるライブラリです。そして、この素晴らしいライブラリを作成してくれたGoogleと素晴らしいGuava開発者に感謝します。


PS:読むこともできます this other SO question

PPS:Google株式を所有していません(まだ)

223
Etienne Neveu

R06リリースから2010年8月からguavaを使用しています。基本的に、開発するグリーンフィールドJavaライブラリがあるため、J2SE APIに最適な付属ライブラリを探しました。従来、Apache Commonsライブラリを使用していましたが、そこにあったものがグアバを使い始めました。

長所

  1. Java 5.0言語コンストラクト。ライブラリは、Blochの「Effective Java:2nd Edition」から設計キューのほとんどを取得します。不変性、ビルダーパターン、コンストラクターの代わりにファクトリー、ジェネリックなど。これにより、コードがよりタイトで表現力豊かになります。
  2. 特に最上位のFunctionおよびPredicateインターフェースを使用した機能プログラミングのサポート。

短所

  1. これは、Apache Commons、特にcommons-codecの十分な代替ではありません。
  2. 「グアバクックブック」はありません。ライブラリは、ミニマルで直交的です。したがって、それを最大限に活用するための明確な学習曲線があります。前述のように、Javadocは優れていますが、いくつかのより長いソースコードのケーススタディが役立ちます。
  3. Java 1.3または1.4を必要とする環境にいる場合、運が悪い。

私にとって、グアバはJava簡潔で表現力豊かなスクリプト言語に近いと感じさせてくれます。それは素晴らしいことです。

24
miniharryc

私の経験では、私は彼らが互いに対立することや、グアバがApacheライブラリを改善することを感じていません。むしろ、guava complements Apache libs。 guavaには、Apacheにはないクラスとユーティリティがあり、逆も同様です。

したがって、それ自体を切り替える必要があることはわかりません-「適切なツールを適切なジョブに使用する」と言います。

16
javamonkey79