2011-01-08 14 views
7

私は今日Scalaクラスを定義しています。「equalsメソッドとhashCodeメソッドが必要です; copyメソッドも便利です。これをケースクラスに変換します。私のクラスはすでに他のコードを持っていて、決して簡単なものではありません。Scalaケースクラスを定義することは適切ですか?

大したことではありませんが、テキストブックでケースクラスを処理する場合、すべての例で値クラスまたは 'データ転送オブジェクト'として使用するように定義されています。非自明なケースクラスを定義することは適切ですか?上記の思考プロセスはOKか、あるいはケースクラスを違う方法で考える必要がありますか?

+0

実際、Daniel Sobralの答えはより詳細で、おそらく私の代わりにそれを受け入れるべきです。 –

+0

するでしょう、Alexey。ありがとう。 – David

答えて

9

case classvalになっているすべてのそれらの主コンストラクタのパラメータに基づいて、equalshashCodetoString方法を提供します。さらに、オブジェクトコンパニオンは、applyunapplyのメソッドを取得します。これらのメソッドもメインコンストラクタのパラメータに基づいています。

また、case classは、SerializableおよびProductから継承しており、他のクラスで拡張しないでください。

これらのすべてがクラスに適している場合は、それを「ケースクラス」として宣言してください。

+0

ケースクラスを拡張しない理由を詳しく説明できますか? – Jus12

+0

@ダニエル:心配しないでください。私はその答えをhttp://scala-programming-language.1934581.n4.nabble.com/scala-Do-you-use-case-class-inheritance-td2001640.htmlで見つけました – Jus12

6

気温が無料、子孫を持たない場合ケースクラスを拡張することは悪い考えです。

+3

これは推奨されていません。 class:class class ClassクラスClassの祖先クラスclass Fooを持ちます。これは、使用法と実装の両方を過度に複雑にすることで廃止されました。代わりに、リーフ以外のノードでパターンマッチングのためにエクストラクタを使用する必要があります。 caseクラスBar(オーバーライドval x:String)はFoo( "Some string")を拡張します – Janx

関連する問題