guavaとapacheの同等のライブラリ間の大きな改善点は何ですか?


123

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

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

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

回答:


223

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

そうは言っても、私が選択しなければならない場合は、Guavaを使用することを選択し、Guavaに必要な機能がない(まれな)場合に備えてApache Commonsを維持します。その理由を説明しよう。

グアバはより「モダン」です

Apache Commonsは非常に成熟したライブラリですが、ほぼ10年前のものであり、Java 1.4をターゲットとしています。Guavaは2007年オープンソースであり、Java 5をターゲットにしているため、Java 5の機能であるGenericsvarargsenums、およびautoboxingから、Guavaに大きなメリットがあります

グアバの開発者によると、ジェネリックは、Apache Commonsを改善する代わりに新しいライブラリを作成することを選択した理由の1つです(「GoogleがApacheを改善しようとしたのに、なぜGoogleがこれをすべて作成したのか」というタイトルでgoogle-collections FAQを参照してください。コモンズコレクションの代わりに?」)。

私はそれらに同意します:しばしば批判されます(具体化なし、下位互換性のために制限されます)が、Javaジェネリックは、Guavaのように適切に使用されると、依然として非常に役立ちます。一般化されていないコレクションで作業するよりも、やめたい!

(Apache Commons 3.0 Java 1.5以降をターゲットとしています)

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

コードは、APIをより読みやすく、発見しやすく、高性能で、安全で、スレッドセーフにするためのベストプラクティスと有用なパターンでいっぱいです...

効果的なJava(素晴らしい本BTW)を読んだ後、コードのいたるところでこれらのパターンを確認しました。

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

これらの設計の選択によってもたらされる利点を説明するために何時間も続けることができます(必要に応じて教えてください)。実は、これらのパターンは「ショーの」ためだけではなく、真の価値があります。APIは使用する喜びであり、学習しやすく(ドキュメント化がどれほど適切であるかを忘れていましたか)、より効率的で、多くのクラスは不変であるため、より単純でスレッドセーフです。

おまけとして、コードを見ることで多くのことを学びます:)

グアバは一貫しています

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

Guavaの背後にある中心的な哲学と設計の選択はライブラリ全体で一貫しており、開発者は非常に優れた(IMO)API設計原則を遵守し、JDK APIの過去の間違い(ただし、それらの間違いではない)から学びました。

グアバは高いパワー対重量比を持っています

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

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

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

グアバは活発に開発中です

Apache Commonsの開発はCommons Lang 3.0での作業により加速しているようですが、グアバは現時点でさらに勢いを増しているようですが、Googleはより多くの内部クラスをオープンソース化しています。

Googleは内部で大きく依存しているので、すぐになくなることはないと思います。さらに、その共通ライブラリをオープンソース化することで、Googleはそれに依存する他のライブラリを(Guiceが現在行っているように再パッケージする代わりに)より簡単にオープンソースできます。

結論

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


PS:この他のSOの質問も読みたいかもしれません

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


ありがとう!*赤面* Guavaの非常に活発な開発の詳細を話し、Java 1.5の機能をより詳しく説明するために、私の回答を編集しました。
Etienne Neveu

1
:ちょうどケビンBourrillionが、この話にはApache Commonsの対グアバ語ることに気づいyoutube.com/watch?v=9ni_KEkHfto#t=42m38s
エティエンヌ・ヌヴー

1つの注意点として、GuavaはAPIを変更し、古いメソッドを頻繁に非推奨にしているため、依存関係があると、バージョンロックインや、Guavaを使用する他のサードパーティライブラリとの非互換性などの問題が発生する可能性があります。
アルキメデストラハノ2017

24

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

長所

  1. Java 5.0言語構造。ライブラリは、Blochの「Effective Java:2nd Edition」からの設計の手掛かりのほとんどを取ります:不変性、ビルダーパターン、コンストラクターの代わりのファクトリー、ジェネリックスなど。これにより、コードがよりタイトで表現力豊かになります。
  2. 関数型プログラミングのサポート、特にトップレベルの関数と述語のインターフェイス。

短所

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

私にとって、GuavaはJavaを簡潔で表現力豊かなスクリプト言語に近づけるように感じさせます。


16

私の経験では、彼らが互いに争ったり、グアバがapache libsを改善しているとは思いません。むしろ、グアバはapache libsを補完します。グアバにはapacheにはないクラスやユーティリティがあり、その逆も同様です。

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


1
私が最近この結論に至ったのは、GuavaがFileNameUtilsでApacheが提供するものに近づいていないことを確認した後です(はい、重複がありますが、ApacheのFileNameUtilsはGuavaのファイルよりはるかに多くあります。また、Googleはなぜ使用しなければならなかったのFilesですか? JDKを使用するにはFiles、パス全体を書き出す必要があります...)。私のアプリには多くのファイルユーティリティが必要だったので、この場合はApacheの使用を避けられませんでした。
Don Cheadle 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.