10

データのプライベートな可変リストを持つクラスがあります。

次の条件を指定して、リスト項目を公開する必要があります。

  • リストは外部で変更可能であってはなりません。
  • getter 関数を使用する開発者にとって、取得したリストを変更できないことは明らかです。

どのゲッター関数を推奨アプローチとしてマークする必要がありますか? または、より良い解決策を提供できますか?

class DataProcessor {
    private final ArrayList<String> simpleData = new ArrayList<>();
    private final CopyOnWriteArrayList<String> copyData = new CopyOnWriteArrayList<>();

    public void modifyData() {
        ...
    }

    public Iterable<String> getUnmodifiableIterable() {
        return Collections.unmodifiableCollection(simpleData);
    }

    public Iterator<String> getUnmodifiableIterator() {
        return Collections.unmodifiableCollection(simpleData).iterator();
    }

    public Iterable<String> getCopyIterable() {
        return copyData;
    }

    public Iterator<String> getCopyIterator() {
        return copyData.iterator();
    }
}

UPD: この質問は、リスト ゲッター実装のベスト プラクティスに関する実際のコード レビュー ディスカッションからのものです。

4

3 に答える 3

1

通常、Iterator は、for-each ループの目的で、Iterable と共にのみ使用されます。Iterable 以外の型に Iterator を返すメソッドが含まれているのを見るのはかなり奇妙で、for-each ループで使用できないことにユーザーが腹を立てるかもしれません。

したがって、この場合は Iterable をお勧めします。implements Iterableそれが理にかなっていれば、クラスを持つことさえできます。

Java 8 ワゴンに飛び乗りたい場合Streamは、おそらくより「現代的な」アプローチを返します。

于 2015-05-12T15:38:29.590 に答える
0

カプセル化規則により、常に変更不可能なリストを返す必要がありました。あなたの場合は設計規則であるため、Collections.unmodifiableCollection を返します。メソッドに getUnmodifiable という名前を付ける必要はありません。ゲッターの命名規則を使用し、Javadoc を使用して他の開発者は、あなたが返すリストの種類とその理由...不注意なユーザーには例外が警告されます!!

于 2015-05-12T15:22:18.643 に答える