[解決済み] Scalaにおけるval-mutableとvar-immutableの比較
質問
Scalaでは、可変コレクションでvalを使用する場合と、不変コレクションでvarを使用する場合のガイドラインはあるのでしょうか?それとも、本当に不変のコレクションでvalを目指すべきですか?
コレクションに両方のタイプがあるという事実は、私に多くの選択肢を与えてくれますが、しばしば私はその選択をする方法を知りません。 どのように選択したらよいのかわかりません。
どのように解決するのか?
よくある質問ですね、これは。難しいのは、重複しているものを見つけることです。
あなたが努力すべきなのは
参照透過性(referential transparency
. これはどういうことかというと、もし私が "e" という式を持っているとしたら、それを
val x = e
と置き換えることができます。
e
を
x
. これはミュータビリティが壊れる性質です。設計上の判断が必要なときはいつでも、参照透過性を最大にすることです。
現実的な問題として、メソッドローカルの
var
は最も安全な
var
は、メソッドをエスケープしないので、存在する中で最も安全です。もしそのメソッドが短ければなおさらです。そうでない場合は、他のメソッドを抽出することでメソッドを減らすようにします。
一方、ミュータブルコレクションには の可能性があります。 があります。コードを変更するとき、それを他のメソッドに渡したり、返したりしたくなるかもしれません。これは、参照透過性を壊すようなものです。
オブジェクト(フィールド)では、ほとんど同じことが起こりますが、より悲惨な結果になります。どちらにしても、オブジェクトは状態を持ち、したがって参照透過性を壊します。しかし、変更可能なコレクションを持つことは、オブジェクト自体でさえ、誰がそれを変更しているかの制御を失うかもしれないことを意味します。
関連
-
[解決済み] 関数型プログラミングで時間関数が存在するのはなぜですか?
-
[解決済み] Javaでリストを反復処理する方法
-
[解決済み】ミュータブルステートなしで何か役に立つことができるのか?
-
[解決済み] 述語で配列を2つに分割するには?
-
[解決済み] scalaの列挙を理解する
-
[解決済み] Scalaのパターンマッチはなぜ変数で機能しないのですか?
-
[解決済み] Scalaの配列の初期化
-
[解決済み] Any、AnyVal、AnyRef、Objectの関係と、Javaコードでのマッピングについて教えてください。
-
[解決済み] sbtとGradleの比較 [終了しました]。
-
[解決済み] 機能的デザインパターン【終了しました
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 述語で配列を2つに分割するには?
-
[解決済み] IntelliJ IDEAで依存関係が変更された後、build.sbtから強制的に再ロードするには?
-
[解決済み] Scalaでは、'val a. = _' (アンダースコア)は具体的にどのような意味ですか?A = _' (アンダースコア)とはどういう意味ですか?
-
[解決済み] SBTが終了せずに実行を停止する
-
[解決済み] 単純な case class の順序を定義する簡単な慣用的方法
-
[解決済み] Any、AnyVal、AnyRef、Objectの関係と、Javaコードでのマッピングについて教えてください。
-
[解決済み] HDFSではなく、ローカルファイルをsc.textFileで読み込む方法
-
[解決済み] sbtとGradleの比較 [終了しました]。
-
[解決済み] 末尾再帰関数が最適化されるためのScalaアノテーションは何ですか?
-
[解決済み] Scalaでリストを2つのフィールドでソートするには?