4

GuavaImmutableListには一連のオーバーロードされたof()メソッドがあります。この解決済みの質問のコンテキストで説明したように、これらは可変引数とジェネリックを混在させるときに発生する警告を回避するために存在します。

しかし、それに加えて、0 および 1 パラメーター メソッドはそれぞれ特殊なリストの実装に依存しています。同じことを 2..11 パラメーター メソッドに対して行うことができるように思われます。これにより、これらのリストのメモリ消費が削減されます。

final class ImmutableListWith2Elements<E> extends ImmutableList<E> {
  final E e1;
  final E e2;
  ...

代わりに、配列ベースの実装を使用します。これは、コンテンツ参照に加えて、配列オブジェクトと配列への参照を格納することを意味します。ここに含まれるトレードオフを理解するのを手伝ってもらえますか?

4

1 に答える 1

5

ここに含まれるトレードオフを理解するのを手伝ってもらえますか?

これは、次の間のトレードオフです。

  • パフォーマンス - 一時配列を割り当てないことによる節約があります。ただし、その節約を定量化するには、大規模なコード分析とベンチマークを行う必要があります。(ほとんどのアプリケーションでは重要ではないと思います。@Voo! によって提供されたこのリンクを読んでください。)
  • 読みやすさ - 余分なオーバーロードがたくさんあると、javadoc が乱雑になります。
  • 保守性 - 一時オブジェクトを必要としないような方法で実装された多数のオーバーロードを持つと、多くのコピー/貼り付けプログラミングが必要になり、将来のコードの保守が難しくなります。
  • ユーティリティ - これらのオーバーロードはどのくらいの頻度で使用されますか? 答えは「まれに」になると思います。
  • バイトコード フットプリント - これらの余分なオーバーロードは、Guava JAR ファイルを使用するすべてのアプリケーションのアプリケーションの肥大化に寄与します。

私のアドバイス:

  • これについて Guava 開発者を悩ませないでください。彼らはすでにトレードオフについて決心しています。息を無駄にするだけです。
  • これらのクラスまたはメソッドの欠如がアプリケーションに悪影響を与える場合は、独自の追加を行ってください。(しかし、Guava のプライベートな「フォーク」を含まない方法でそれを行うようにしてください...おそらく長期的には後悔するでしょう.)

記録として、Guava 開発者はこれを正しく理解したと思います。

于 2012-05-13T00:48:06.087 に答える