問題タブ [immutability]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Hashtable を不変にする
Hashtable から派生クラスを作成するにはどうすればよいですか? オブジェクトを追加することはできますが、削除または置換することはできません。
何をオーバーライドする必要があり、特に [] 演算子をオーバーライドするにはどうすればよいですか?
java - Hibernate を使用する場合の @Immutable と @Entity(mutable=false) の違いは何ですか?
もしあれば、2つの違いは何ですか?
エンティティで一方または両方を使用する必要がありますか?
java - 可変または不変のメソッドへのアクセスを制限するにはどうすればよいですか?
新しいJavaプロジェクトでは、可能な限り多くのベストプラクティスを適用しようとしています。私が問題を抱えているのは不変性です。概念を理解し、すでにいくつかの不変クラスを構築しましたが、今では、可変クラスとして実行する方が適切だと思うクラスに到達しました。
主な問題は、場合によってはクラスの可変部分を非表示にして、MVCのビューレイヤーがオブジェクトを直接変更できず、コントローラーを経由する必要があることです。
私はそれを行う2つの方法を考えました:
すべての不変メソッドを含むインターフェース「Thing」(読み取り専用)を作成し、セッターを含むインターフェース「MutableThing」を作成します。
すべてのメソッドを1つのインターフェイスに配置し、Collections.unmodizableList(obj)メソッドのようにオブジェクトをラップして、変更メソッドへのアクセスを制限し、変更メソッドにアクセスするときに例外がスローされるようにします。
私はそれがよりきれいでよりよく設計されていると思うので最初のものを好むでしょう、しかし私はそれに1つの問題があります。「Thing」インターフェースにaddListener(l)とremoveListener(l)があるので、ビューレイヤーはそれ自体をいくつかのモデルオブジェクトのリスナーとして登録できます。しかし、「Thing」インターフェースのこれら2つのメソッドでは、それだけでは意味がなくなります。実際にデータを変更する方法がない場合、インターフェイスにデータの変更を通知するリスナーを登録する機能があるのはなぜですか?これらのメソッドを「MutableThing」インターフェイスに配置することはできますが、ビューレイヤーは「Thing」インターフェイスにしかアクセスできず、リスナーとして登録できませんでした。
これが機能しない理由は、リスナーのせいだけですが、ビューレイヤーは、モデルのリスナーとして自分自身を登録する責任が実際にありますか?コントローラがなんとかして(「MutableThing」にアクセスできる)それを行うことができれば、問題はありませんが、それを実現する方法がわかりません。
あなたは何を提案しますか?
ありがとう!
c# - C#では、クライアントがリストを読み取ることはでき、書き込むことはできないように、メソッドはリストを返すことができますか?
私がC#クラスを持っているとしましょう:
クライアントはそれを呼び出すことができます:
Add
の読み取り専用バージョンのみ_barList
が返されるため、メソッドを失敗させる方法はありますか?
data-structures - Haskell Edison APIとCoreをF#に移植することに何か利点はありますか?
Edison APIおよびコアモジュールは、純粋に機能的なデータ構造のHaskell実装です。
F#とネイティブの.Netデータ構造は、Edison APIとCoreのユースケースを十分にカバーしていますか?
APIとCOREHaskellモジュールをF#に移植しようとすることに何か利点はありますか?
data-structures - 複数のインデックスを持つ効率的なインデックスの永続的なデータ構造はありますか
効率的なインデックス付き永続データ構造を探しています。私は通常.NETで作業し、FSharpのマップを認識していますが、その実装と私が認識している他のほとんどは、マッピングの左側である単一の「インデックス」のみを提供しています。
基本的にシナリオはこちら
オブジェクトの Id は、追加されたアイテムのグローバルに一意のセットになります。GroupId の値が重複している可能性があります。一致する GroupId を持つすべての値を照会できるようにしたいと考えています。GroupId 内の名前は一意ですが、異なる GroupId 間で重複する可能性があります。これは、特定のフィールド値に基づいてアイテムのグループに個別にアクセスする必要があるため、3 つのフィールドの複合キーを単純に作成できる状況ではありません。
私はこれを行うことができ、過去に、STackoverflowの他の投稿で推奨されている辞書の辞書を使用していました...ただし、データ構造も1)完全に永続的であり、2)効率的であることを望んでいますメモリ内 - バージョンはできるだけ多くのノードを共有する必要があることを意味します 3) 変更が効率的 - 高速にしたい
ここでかなりのことを求めていることは承知していますが、車輪の再発明がすでに行われている場合は、それを再発明しようとさえしないようにお願いしたかったのです。
ありがとう
java - 最終クラスはすべて不変ですか?
Java のすべての最終クラスは不変です。String と Integer はどちらも最終クラスであり、どちらも不変です。
java - 文字列は不変です。つまり、+= を使用してはならず、StringBuffer だけを使用するべきではありません。
文字列は不変です。つまり、一度作成すると変更できません。
では、これは、StringBuffer を作成してそれにテキストを追加した場合よりも、+= を追加した方がより多くのメモリを消費するということでしょうか?
+= を使用すると、メモリに保存する必要があるたびに新しい「オブジェクト」を作成することになりますね。
c# - BigIntegerは不変ですか?
.NET 4ベータ2には、。を含む新しいNumerics名前空間があり struct BigInteger
ます。ドキュメントには、私が予想したように、それは不変のタイプであると記載されています。
しかし、私はポストインクリメント演算子(++
)に少し混乱しています。これは間違いなく値を変化させるようです。次のwhileループが機能します。
これは、MSDNがインクリメント演算子について言っていることです。
BigIntegerオブジェクトは不変であるため、Increment演算子は、valueで表されるBigIntegerオブジェクトよりも値が1大きい新しいBigIntegerオブジェクトを作成します。したがって、Incrementを繰り返し呼び出すと、コストがかかる可能性があります。
うまくいっていれば、使用する必要があるかどうかは理解できたはずですが 、値を変更するにはb = b++
、明らかにそれだけで十分です。++
何かご意見は?
java - Javaの機能データ構造
Java標準ライブラリには、機能更新を伴う不変のセット、リストなどの機能データ構造がありますか?