Java 9 のコレクションのオーバーロードされたコンビニエンス ファクトリ メソッドの目的は何ですか? 質問する

Java 9 のコレクションのオーバーロードされたコンビニエンス ファクトリ メソッドの目的は何ですか? 質問する

Java 9には便利なファクトリーメソッド不変のリストを作成するためのものです。最終的にリストの作成は次のように簡単です:

List<String> list = List.of("foo", "bar");

しかし、このメソッドには 12 個のオーバーロード バージョンがあり、そのうち 11 個は 0 〜 10 個の要素を持ち、1 個は var 引数を持ちます。

static <E> List<E>  of(E... elements)

Setおよびの場合も同様ですMap

var args メソッドがあるので、さらに 11 個のメソッドを用意する意味は何でしょうか?

私の考えでは、var-args は配列を作成するため、他の 11 個のメソッドは追加オブジェクトの作成をスキップでき、ほとんどの場合、0 〜 10 個の要素で十分です。他に理由があるのでしょうか?

ベストアンサー1

からJEPドキュメントそれ自体 -

説明-

これらには可変引数オーバーロードが含まれるため、コレクションのサイズには固定の制限はありません。ただし、作成されたコレクション インスタンスは、より小さいサイズに合わせて調整される可能性があります。最大 10 個の要素に対応する特殊なケースの API (固定引数オーバーロード) が提供されます。これにより、API が多少乱雑になりますが、varargs 呼び出しによって発生する配列の割り当て、初期化、ガベージ コレクションのオーバーヘッドが回避されます。重要なのは、固定引数オーバーロードまたは可変引数オーバーロードのどちらが呼び出されても、呼び出しサイトのソース コードは同じであることです。


編集- モチベーションを高めるために、@CKing のコメントでもすでに述べられているように:

非目標-

任意の数の要素を持つ高性能でスケーラブルなコレクションをサポートすることが目標ではありません。小さなコレクションに焦点を当てる

モチベーション-

小さく変更不可能なコレクション (セットなど) を作成するには、コレクションを構築し、ローカル変数に格納し、そのコレクションに対して add() を複数回呼び出し、ラップする必要があります。

Set<String> set = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("a", "b", "c")));

Java 8 Stream API を使用すると、ストリーム ファクトリ メソッドとコレクターを組み合わせて、小さなコレクションを構築できます。

// Java 8
Set<String> set1 = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(Collectors.toSet()));

コレクション リテラルの利点の多くは、言語を変更する場合に比べてコストとリスクを大幅に削減しながら、小さなコレクション インスタンスを作成するためのライブラリ API を提供することで得られます。たとえば、小さな Set インスタンスを作成するコードは次のようになります。

// Java 9 
Set set2 = Set.of("a", "b", "c");

おすすめ記事