2016-03-22 4 views
1

私は通常の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つは、childrenArgcustomNodeArgです。これは、通常のメソッドパラメータです。すなわち、それらはインスタンスの構築中にのみ存在し、クラスコンストラクタの実行完了時にクラスインスタンスから完全に消滅する(そうでなければ捕捉されない限り)。しかし、これは両方childrenArgcustomNodeArgパラメータの望ましくない効果をもたらし

class Node(identity: String, childrenArg: List[Node], customNodeArg: CustomNode) { 
    val children: List[Node] = childrenArg 
    val customNode: CustomNode = customNodeArg 
} 

:不変ケースクラスにこれを変換する

私の最初の素朴な試みは、この(ちょうど最初のパラメータからvalを除去する)でした(通常のメソッドパラメータとして残すのではなく)(読み取り専用の)プロパティになるようになりました。そして、これはコンパイラに含まれているという望ましくない効果が、equalshashCodeの実装を生成しました。

不変のケースクラスのコンストラクタパラメータchildrenArgcustomNodeArgは、identityがケースクラスの唯一の読み取り専用プロパティであるようにマークするにはどうすればよいですか?

これに関するガイダンス。回答、ウェブサイトのディスカッションリンクなどが大歓迎です。

+0

これはScalaの_case_クラスではなく、一般的なScalaのクラスについて、具体的です。 IOW、これはこの他のStackOverflowの質問の複製ではありません:http://stackoverflow.com/q/1889454/501113 – chaotic3quilibrium

答えて

1

あなたにゲッターとセッターを与える:

scala> trait CustomNode 
defined trait CustomNode 

scala> case class Node(identity: String)(childrenArg: List[Node], customNodeArg: CustomNode) 
defined class Node 

scala> val n = Node("id")(Nil, null) 
n: Node = Node(id) 

scala> n.identity 
res0: String = id 

scala> n.getClass.getDeclaredFields.map(_.getName) 
res1: Array[String] = Array(identity) 
+0

これは私が探していたソリューションのタイプです。 Tysvm! Scalaは柔軟性があり、解決策が見えないことがあります。私は追加の引数リストについて知っていた。私はこの方法でそれらを使用することを見たことがない、または考えたことがありません。驚くばかり! – chaotic3quilibrium

+0

私は有向グラフでサイクルを見つけることに関連する別のStackOverflow質問に答えてあなたのソリューションを使用しました。私は、答えの一番下にある抽象クラスで使用しました:http://stackoverflow.com/a/36144158/501113 – chaotic3quilibrium

0

ケースクラスのパラメータはデフォルトではvalですが、それらを変数に設定することもできます。

case class Node(identity: String, var childrenArg: List[Node], var customNodeArg: CustomNode) 

彼らはvarsの作成が第2パラメータリストは、トリックを行うように思わ自動的

+0

私は 'childrenArg'と' customNodeArg'の両方として私の問題を解決しないとは思わないパラメータはまだプロパティです。すなわち、コンパイラ生成の 'equals'および' hashCode'関数の実装に含まれています。それが暗黙のうちに(私は私の質問を編集して明示的にしています)、私はケースクラスが不変である必要があります。また、 'var'パラメータがあれば、ケースクラスを変更することができます。 – chaotic3quilibrium

関連する問題