Scala では、オブジェクトの変更可能な属性 (例えば、数値のバッグ) を持つことを計画している場合、それが適切なのはいつですか?
- var を作成し、不変のデータ構造を使用しますか?
- val を作成し、変更可能なデータ構造を使用しますか?
スレッド化されたアプリケーションに #2 を使用したいという推測を投げかけますか? 一部のコレクションはスレッドセーフですか?
一般的にはどうですか?(それともあまり関係ない?)
Scala では、オブジェクトの変更可能な属性 (例えば、数値のバッグ) を持つことを計画している場合、それが適切なのはいつですか?
スレッド化されたアプリケーションに #2 を使用したいという推測を投げかけますか? 一部のコレクションはスレッドセーフですか?
一般的にはどうですか?(それともあまり関係ない?)
あなたの質問に対する完全な回答ではありませんが…</p>
質問の 1 または 2 は、マルチスレッド環境には適していませんval
。不変のデータ構造を持つ s は適しています。可変コレクションへのマルチスレッド アクセスについては、java.util.concurrent
パッケージからの Java のコレクションをお勧めします。たとえば、変更可能な同時ハッシュ マップを作成するには、次のようにします。
def emptyConcurrentHashMap[K, V] = {
import collection.JavaConverters._
new java.util.concurrent.ConcurrentHashMap[K, V].asScala
}
このようなより慣用的な Scala アクセサーを引き続き取得し、特別なアトミック ミューテーター メソッド (def putIfAbsent(k: A, v: B): Option[B]
および などdef replace(k: A, oldvalue: B, newvalue: B): Boolean
) を使用します。
または、不変のコレクションを保持するを使用しAtomicReference
て、それをそのcompareAndSet
メソッドに置き換えることもできます。
選択肢 1 と 2 の間では問題ありません - ミュータブルはミュータブルであり、複数のスレッドから値を読み取ったり変更したりする場合は、プロパティ自体var
が不変データ構造またはval
可変データ構造の どちらを選択しても、自動同期は行われません。