1

クラスの機能のリストを保持するクラスがあります。これらの機能は、読み取りと比較してめったに変更されません。読み取りは、ほとんどの場合、機能リストの反復です。このため、私はCopyOnWriteArrayList.

私はこのような機能が欲しい:

function Feature[] getFeatures() {
  .. implementation goes here ..
}

認めますが、その理由は少し怠惰かもしれません。次のようなコードを書きたいと思います。

for (Feature f: object.getFeatures()) {
  .. do something interesting ..
}

これではなく:

Iterator<Feature> iter = object.getFeatureIterator();
while (iter.hasNext()) {
  Feature f = iter.next();
  .. do something interesting ..
}

主な質問は - 私はここで怠惰ですか?私はこのパターンに多く従うつもりであり、コードの最初のチャンクは保守がはるかに簡単だと思います。明らかに、基になる配列を変更することは決してなく、これをドキュメントに記載します。

この状況を処理する適切な方法は何ですか?

4

5 に答える 5

1

リストのクローンを作成できます

public List<Feature> getFeatures() {
    return (List<Feature>)this.features.clone();
}

copyOnWriteArrayListのクローンを作成しても、基になる配列はコピーされません

于 2011-11-19T00:03:36.597 に答える
1

あなたの理由がわかりません: a を返し、List<Feature>あなたのCopyOnWriteArrayListまたは変更不可能なコピーを使用し、foreach. なぜあなたは特に配列が欲しいのですか?

于 2011-11-18T23:51:54.100 に答える
1

リストで toArray メソッドを呼び出すだけです。

public Feature[] getFeatures() {
    return this.featureList.toArray(new Feature[this.featureList.size()]);
}

foreach 構文はすべての Iterable オブジェクトで使用でき、List は Iterable であることに注意してください。

public List<Feature> getFeatures() {
    return this.features;
}

同じ foreach ループを使用します。呼び出し元に内部リストを変更させたくない場合は、リストの変更不可能なビューを返します。

public List<Feature> getFeatures() {
    return Collections.unmodifiableList(this.features);
}
于 2011-11-18T23:52:58.173 に答える
1

クラスは をCopyOnWriteArrayList実装します。これは、シュガーループ構文Iterableを使用するために必要なすべてです。上記の場合for、明示的に取得する必要はありません。Iterator

コンパイルされていないことがわかりましたか?

于 2011-11-18T23:53:49.890 に答える