この一連の投稿では、同じ機能をコード化するさまざまな方法を比較しています。前回の投稿では、単一要素のリストを作成するために Collections.singletonList と ArrayList を比較しました。
この投稿では、Collections.singletonList と別のよく知られたファクトリ メソッド List.of.
を比較します。public static
public static void main(String[] args) { final var addresses = Collections.singletonList( new Address( "742 Evergreen Terrace", "Springfield", "New York", "13468", "US" )); System.out.println(addresses); }
このメソッドは、指定されたオブジェクトのみを含む不変のリストを返します。 Java 1.3で導入されました。 ArrayList に対する利点については前回の投稿で説明しましたが、要約すると:
静的
public static void main(String[] args) { final var addresses2 = List.of( new Address( "1007 Mountain Drive", "Bristol Township", "New Jersey", null, "US" )); System.out.println(addresses2); }
List.of(E e) メソッドも、変更不可能なリストを返すファクトリ メソッドです。 1 つの要素のみをサポートする Collections.singletonList(E e) とは異なり、List.of は 0 ~ 10 の要素と、複数の要素を含む配列をサポートします。これは、singletonList.
の 17 年後、Java 9 で導入されました。SingletonList とは異なり、次のコメントがあることに注目してください:
指定されたオブジェクトのみを含む不変リストを返します。
Array.of は、変更不可能なリスト:
であることを示しています1 つの要素を含む変更不可能なリストを返します。
これは、コレクションの不変性についての新たな理解を反映しています。このドキュメントによると:
要素を追加、削除、または置換できない場合、コレクションは変更不可能とみなされます。ただし、変更不可能なコレクションは、コレクションに含まれる要素が不変である場合にのみ不変になります。
この用語の違いにもかかわらず、どちらのファクトリ メソッドもほぼ同じ機能を備えています。 UnmodifiableList の内部をさらに詳しく調べると、次のことがわかります:
staticList of(E e1) { return new ImmutableCollections.List12(e1); }
なんと驚くべきことに、彼らは 不変 というあまり正確ではない用語を使用していたのです!
static final class List12extends AbstractImmutableList implements Serializable { @Stable private final E e0; @Stable private final E e1; List12(E e0) { this.e0 = Objects.requireNonNull(e0); this.e1 = null; } ... }
static abstract class AbstractImmutableListextends AbstractImmutableCollection implements List , RandomAccess { // all mutating methods throw UnsupportedOperationException @Override public void add(int index, E element) { throw uoe(); } @Override public boolean addAll(int index, Collection extends E> c) { throw uoe(); } @Override public E remove(int index) { throw uoe(); } @Override public void replaceAll(UnaryOperator operator) { throw uoe(); } @Override public E set(int index, E element) { throw uoe(); } @Override public void sort(Comparator super E> c) { throw uoe(); }
唯一の違いは、List12 には潜在的に 2 つの要素に対して 2 つのフィールドがあることです。これにより、大きなオブジェクトを処理しない限り、メモリ使用量も無視できます。
今回は、Collections.singletonList と List.of ファクトリメソッドを比較して、単一要素のリストを作成しました。 immutable と unmodifiable のセマンティクスについて説明し、どちらの方法も効率的で簡潔でリソースが少ないことを示しました。より新しい Java バージョンを使用できる場合は、その使いやすさと明瞭さ、そしてコレクションよりもリスト インターフェイスをよく使用するため、そのバージョンの方が望ましいと考えられます。古い Java バージョンに制限されている場合は、Collections.singletonList が確実な選択肢となります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3