12

List.of() または Collections.emptyList()およびList.of(...) または Collections.unmodifiableList()で与えられたコメントと回答のコンテキストで、 次の2つの経験則を思いつきました(これはそれに応じSetMap工場)。

  1. すべてのオカレンスを置き換えないでください

Collections.emptyList()読みやすさのために、たとえば次のような遅延フィールドメンバーを初期化するときに使用し続けます。

class Bean {
  private List<Bean> beans = Collection.emptyList();
  public List<Bean> getBeans() {
    if (beans == Collections.EMPTY_LIST) { beans = new ArrayList<>(); }
    return beans;
  }
}
  1. メソッド引数ビルダーとして新しいファクトリを使用する

パラメータを使用して実行可能ファイルを呼び出すときに、新しいファクトリList.of()とバリアントを迅速でタイプの少ないバージョンとして使用しListます。これが私の現在の置換パターンです。

Collections.emptyList()       --> List.of()
Collections.singletonList(a)  --> List.of(a)
Arrays.asList(a, ..., z)      --> List.of(a, ..., z)

の架空の使用法でCollections.indexOfSubListは、次の行

Collections.indexOfSubList(Arrays.asList(1, 2, 3), Collections.emptyList());
Collections.indexOfSubList(Arrays.asList(1, 2, 3), Collections.singletonList(1));
Collections.indexOfSubList(Arrays.asList(1, 2, 3), Arrays.asList(1));
Collections.indexOfSubList(Arrays.asList(1, 2, 3), Arrays.asList(2, 3));
Collections.indexOfSubList(Arrays.asList(1, 2, 3), Arrays.asList(1, 2, 3));

読むつもりです

Collections.indexOfSubList(List.of(1, 2, 3), List.of());
Collections.indexOfSubList(List.of(1, 2, 3), List.of(1));
Collections.indexOfSubList(List.of(1, 2, 3), List.of(1));
Collections.indexOfSubList(List.of(1, 2, 3), List.of(2, 3));
Collections.indexOfSubList(List.of(1, 2, 3), List.of(1, 2, 3));

あなたは(反対)同意しますか?

4

2 に答える 2

9

(Im)可変性

まず、コレクション ファクトリが不変のバリアントを返すことに注意することが重要です。残念ながら、これは型システムには表示されないため、手動/精神的に追跡する必要があります。これは、他の方法では価値があるかもしれないいくつかの置換を既に禁止しているため、ルールのリストで0.になる必要があります。:)

たとえば、後で他のコードによって変更されるシード要素のコレクションを作成すると、次のようになります。

private final Set<String> commonLetters = initialCommonLetters()

private static Set<String> initialCommonLetters() {
    Set<String> letters = new HashSet<>();
    letters.add("a");
    letters.add("e");
    return letters;
}

単純に書くのは素晴らしいことですcommonLetters = Set.of("a", "e");が、返されたセットが不変であるため、他のコードが壊れる可能性があります。

定数

(im)mutability の議論はすぐに定数につながります。これが導入の大きな理由でした!COMMON_LETTERSその定数を作成するために静的初期化ブロックが必要な時代は終わりました。したがって、これはユースケースを最初に探す場所です。

交換する

Collections::empty...あなたが言うように、 、Collections::singleton...、またはArrays::asList単に楽しみのために呼び出しを置き換える理由はないようです。ただし、クラスで新しいメソッドを使い始めるとすぐに、古いバリアントも置き換えて、コードがより少ない概念に依存するようにし、理解を容易にします。

好み

of()最後の引数は、バリアント全般に適用できるものでもあります。Collections::empty...とはそのCollections::singleton...意図についてやや明確ofですが、引数の数に関係なく常に を使用すると、全体としてより少ない概念を使用するコードを作成することでその利点が相殺されると少し言いがちです。

を使い続ける理由がわかりませんArrays::asList

于 2016-11-30T13:15:09.900 に答える