私は通常のScalaクラスを持っています。不変のケースクラスにリファクタリングしたいと思います。 Set
オペレーションでクラスが正常に動作するようにするためには、すべてのScalaコンパイラがケースクラスで提供されるメソッドを自動的に生成したいと思っています。 IOW、私はこれらのさまざまな方法を書く必要を避けたいと思っています。 equals
,hashCode
,toString
などであり、それは非常にエラーを起こしやすいからである。そして、私はクラスの筏のためにこれを行う必要があるので、私は一般的な解決策を必要としています。特定の解決策の異常な迅速な修正やハックだけではありません。ここで不変の_case_クラスのプライマリコンストラクタでローカルパラメータを定義する具体的な例が必要
は、私が働いていると、クラスの:
class Node(val identity: String, childrenArg: List[Node], customNodeArg: CustomNode) {
val children: List[Node] = childrenArg
val customNode: CustomNode = customNodeArg
}
あなたが見ることができるように、クラスのコンストラクタは、3つのパラメータを持っています。最初の1つはidentity
で、読み取り専用のプロパティです。残りの2つは、childrenArg
とcustomNodeArg
です。これは、通常のメソッドパラメータです。すなわち、それらはインスタンスの構築中にのみ存在し、クラスコンストラクタの実行完了時にクラスインスタンスから完全に消滅する(そうでなければ捕捉されない限り)。しかし、これは両方childrenArg
とcustomNodeArg
パラメータの望ましくない効果をもたらし
class Node(identity: String, childrenArg: List[Node], customNodeArg: CustomNode) {
val children: List[Node] = childrenArg
val customNode: CustomNode = customNodeArg
}
:不変ケースクラスにこれを変換する
私の最初の素朴な試みは、この(ちょうど最初のパラメータからval
を除去する)でした(通常のメソッドパラメータとして残すのではなく)(読み取り専用の)プロパティになるようになりました。そして、これはコンパイラに含まれているという望ましくない効果が、equals
とhashCode
の実装を生成しました。
不変のケースクラスのコンストラクタパラメータchildrenArg
とcustomNodeArg
は、identity
がケースクラスの唯一の読み取り専用プロパティであるようにマークするにはどうすればよいですか?
これに関するガイダンス。回答、ウェブサイトのディスカッションリンクなどが大歓迎です。
これはScalaの_case_クラスではなく、一般的なScalaのクラスについて、具体的です。 IOW、これはこの他のStackOverflowの質問の複製ではありません:http://stackoverflow.com/q/1889454/501113 – chaotic3quilibrium