web-dev-qa-db-ja.com

Google GuavaとApache Commons

私は bidirectional map Javaの実装を探していましたが、これら2つのライブラリにつまずきました。

どちらも無料で、私が探していた双方向マップの実装(ApacheのBidiMap、GoogleのBiMap)があり、驚くほどほぼ同じサイズ(Apache 493 kB、Google 499 kB)[ed .:もうtrue!]と思われるあらゆる点で私とかなり似ています。

どちらを選択する必要があり、なぜですか?他の同等の代替手段はありますか(無料で、少なくとも双方向マップが必要です)?私は最新のJava SEを使用しているので、Java 5またはそのようなものに人為的に制限する必要はありません。

207
Joonas Pulakka

私の意見では、より良い選択は Guava (以前はGoogleコレクションとして知られていました):

  • より現代的です(ジェネリックがあります)
  • コレクションAPIの要件に完全に準拠しています
  • 積極的に維持されています
  • CacheBuilder およびそれの前身 MapMaker はただの素晴らしい

Apache Commons Collectionsも同様に優れたライブラリですが、ジェネリック対応バージョン(これはmajor私の意見ではコレクションAPIの欠点です)の提供に長い間失敗しましたメンテナンス/ドント・トゥ・トゥ・トゥー・マフ・ワーク・オン・イット・モードにあるようです 最近、Commons CollectionsがSteamを再び取り上げましたが、やるべきことがいくつかあります。

ダウンロードサイズ/メモリフットプリント/コードサイズが問題である場合、Apache Commons Collectionsは他のライブラリの一般的な依存関係であるため、より良い候補になる可能性があります。したがって、追加の依存関係を追加せずに、独自のコードで使用することもできます。編集:多くの新しいライブラリは実際にはGuavaとnotApache Commons Collectionsに依存しているため、この特定の「利点」は部分的に破壊されています。

183
Joachim Sauer

私が見つけた最も重要なことは、Googleコレクションを開始する場所にします。

  • ジェネリック(ジェネリックなしのコレクション-FTL)
  • コレクションフレームワークとの一貫性(Josh Blochはこのフレームワークの主要なプレーヤーでした)
  • 正確さ。これらの人たちは、この問題を正すことに必死に結びついています。 25Kの単体テストのようなものがあり、APIを適切に取得することに結びついています。

主な著者によって与えられた講演の素晴らしい Youtubeビデオ であり、彼はこのライブラリについて知っておく価値があるものについて議論するのに良い仕事をしています。

71
joeslice

よくある質問: Google Collections FAQ

Apache Commons Collectionsを代わりに改善しようとしても、Googleがこれらすべてを構築したのはなぜですか?

Apache Commons Collectionsは明らかに私たちのニーズを満たしていませんでした。ジェネリックは使用しません。これは、コードからコンパイル警告を受け取るのを嫌うため、私たちにとって問題です。また、長い間「保有パターン」にありました。喜んで使用するまでそれを修正するにはかなりの大きな投資が必要であり、その間、私たち自身のライブラリはすでに有機的に成長していたことがわかりました。

Apacheライブラリと私たちのライブラリとの重要な違いは、コレクションが実装するJDKインターフェイスで指定されたコントラクトを忠実に遵守していることです。 Apacheのドキュメントを確認すると、無数の違反例が見つかります。これらを非常に明確に指摘したことは信用に値しますが、それでも標準的な収集動作から逸脱することは危険です!そのようなコレクションで何をするかに注意する必要があります。バグは常に発生するのを待っています。

私たちのコレクションは完全に生成されており、契約に違反することはありません(JDKの実装が許容される違反の強力な先例を設定している場合を除き、個別の例外を除きます)。これは、コレクションを期待するメソッドにコレクションの1つを渡すことができ、物事が正確に機能することをかなり確信していることを意味します。

70
Davide Consonni